我一般是在点击更新的时候,调用 sql 语句,对某条进行单独的更新;有同事说可以对整个datatable 进行更新,然后在更新到数据库里面去。请问第2 种方式具体是怎么实现的?
 并且在对datagrid 进行编辑,保存的时候,保存到数据库里面去的方法还有哪些?谢谢!谢谢!

解决方案 »

  1.   

    提供一点思路
    #region "Just for congigruable form" private static readonly string UpdateSql = "Update {0} set {1} {2}";
    private static readonly string SetSql = "{0} = @{0}";
    private static readonly string WhereSql = "where {0} = @{0}";
    private static readonly string where2 = "where {0} = '{1}'";
    private static readonly string InsertSql = "Insert {0}({1}) values({2})";
    private static readonly string DeleteSql = "Delete * from {0} {1}";
    private static readonly string SelectSql = "Select * from {0} {1}"; public static DataTable GetTableData(string TableName, Guid ID)
    {
    //PrimaryKey Column Name = TableName + "ID"
    string PKName = TableName + "ID";
    string where = string.Format(where2, PKName, ID );
    string select = string.Format(SelectSql, TableName, where); DataTable dtb = ExecuteDataset(select).Tables[0];

    dtb.TableName = TableName;
    return dtb;
    } public static bool ExistRowByID( string tableName, Guid Id )
    {
    string PKName = tableName + "ID";
    string where = string.Format(where2, PKName, Id );
    string select = string.Format(SelectSql, tableName, where); object o = ExecuteScalar( select );

    if( o == null )
    {
    return false;
    }
    else
    {
    return true;
    }
    } public static DataTable GetEmptyTable(string TableName,int rowCount)
    {
    Guid ID = System.Guid.NewGuid();
    DataTable dt = GetTableData(TableName, ID); string PKName = TableName + "ID";
    DataRow dr; for( int i=0; i< rowCount; i++ )
    {
    dr = dt.NewRow();
    dr[PKName] = ID;
    dt.Rows.Add( dr );
    }
    //InsertTableData( dt ); return dt;
    } public static void UpdateTableData(DataTable dtb)
    {
    string TableName = dtb.TableName;
    string PKName = TableName + "ID";

    StringBuilder values = new StringBuilder();
    string   Where  = string.Empty;
    for (int k=0; k<dtb.Columns.Count; ++k)
    {
    if (dtb.Columns[k].ColumnName == PKName)
    {
    Where = string.Format(WhereSql, PKName);
    continue;
    }
    values.AppendFormat(SetSql, dtb.Columns[k].ColumnName);
    if (k < dtb.Columns.Count-1)
    {
    values.Append(", ");
    }
    }
    for (int i=0; i<dtb.Rows.Count; ++i)
    {
    System.Data.IDataParameter[] parameters = GetDataParameters(dtb, i);
    string sql = string.Format(UpdateSql, TableName, values.ToString(), Where);
    ExecuteScalar(sql, parameters);
    }
    } public static void InsertTableData(DataTable dtb)
    {
    string TableName = dtb.TableName;
    string PKName = TableName + "ID"; StringBuilder insertValues = new StringBuilder();
    StringBuilder cloumn_list = new StringBuilder();
    for (int k=0; k<dtb.Columns.Count; ++k)
    {
    cloumn_list.Append(dtb.Columns[k].ColumnName);
    insertValues.Append("@"+dtb.Columns[k].ColumnName);

    if (k < dtb.Columns.Count-1)
    {
    cloumn_list.Append(",");
    insertValues.Append(",");
    }
    } for (int i=0; i<dtb.Rows.Count; ++i)
    {
    System.Data.IDataParameter[] parameters = GetDataParameters(dtb, i);
    string sql = string.Format(InsertSql, TableName, cloumn_list.ToString(), insertValues.ToString());
    ExecuteScalar(sql, parameters);
    }
    } public static void DeleteTableData(string TableName, string ID)
    {
    string PKName = TableName + "ID";
    string where = string.Format(where2, PKName, ID);
    string sql = string.Format(DeleteSql, TableName, where);
    ExecuteScalar(sql);
    } private static System.Data.IDataParameter[] GetDataParameters(DataTable dtb, int rowIndex)
    {
    //PrimaryKey Column Name = TableName + "ID"
    string PKName = dtb.TableName + "ID";
    System.Data.IDataParameter[] param = new System.Data.IDataParameter[dtb.Columns.Count];
    for (int i=0; i<dtb.Columns.Count; ++i)
    {
    param[i] = new System.Data.SqlClient.SqlParameter();
    param[i].ParameterName = string.Format("@{0}", dtb.Columns[i].ColumnName);
    param[i].DbType = GetDbType(dtb.Columns[i].DataType);
    param[i].Value = dtb.Rows[rowIndex][i];
    }
    return param;
    } private static System.Data.DbType GetDbType(Type type)
    {
    DbType result = DbType.String;
    if( type.Equals( typeof(int) ) ||  type.IsEnum )
    result = DbType.Int32;
    else if( type.Equals( typeof(long) )  )
    result = DbType.Int32;
    else if( type.Equals( typeof(double) ) || type.Equals( typeof(Double) ) )
    result = DbType.Decimal;
    else if( type.Equals( typeof(DateTime) ) )
    result = DbType.DateTime;
    else if( type.Equals( typeof(bool) ) )
    result = DbType.Boolean;
    else if( type.Equals( typeof(string) ) )
    result = DbType.String;
    else if( type.Equals( typeof(decimal) ) )
    result = DbType.Decimal;
    else if( type.Equals( typeof(byte[]) ) )
    result = DbType.Binary;
    else if( type.Equals( typeof(Guid) ) )
    result = DbType.Guid; return result;

    } #endregion
    public static object ExecuteScalar(string sql)
    {
    return db.ExecuteScalar(System.Data.CommandType.Text  ,sql);
    }
      

  2.   

    还可以用适配器Adapter.
    适配器是建立数据库数据与内存数据集的映射的桥梁,通过适配器即可将数据库中的数据加载到内存中去,也可以将内存中的更新或增加的数据保存到数据库中,所以可以利用适配器来实现保存数据到数据库中的方法,但是要注意数据库数据与内存中数据的一致性.
    如果是sql连接数据库的话,那么SqlDataAdapter就是这种连接下的数据适配器,我给几句保存数据的关键代码:
    //连接数据库部分(略)
    ....
    DataSet ds = new DataSet();
    SqlDataAdapter adapter = new SqlDataAdapter(sqlcommand,sqlconnection);
    //将执行返回的数据结果装载到内存的数据集中,并取名该结果为表tablename
    adapter.Fill(ds,"tablename");
    //若ds中的数据发生了更新
    DataSet changedData = this.ds.GetChanges();
    if (changedData != null)
    {
    //更新数据库
    int changedRows = adapter.Update(changedData);
    MessageBox.Show("数据库成功更新了" + changedRows + "条记录", "成功",MessageBoxButtons.OK,MessageBoxIcon.Information);
    //更新数据集
    ds.AcceptChanges();
    }具体的你可以查查msdn或这方面的书籍.
      

  3.   

    不太明白你同事所说的
    据我所知道的
    对编辑
    1.注册datagrid的edit事件,点编辑时修改数据
    2.把datagrid的绑定列改为模板列,直接绑定,修改数据对数据收集
    1.把收集到数据直接传到一个method
    2.把数据收集到一个datatable/datarow,再传到一个method
    3.把数据收集到一个class里,再传到一个method对数据更新
    1.手动生成sql语句
    2.调用储存过程
    3.使用SqlCommandBuilder生成update语句,再用SqlDataAdapter.Update()来更新 //我用的时候经常碰到并发冲突,很少用唱首歌过来听听先~~~~~~~~~~~~~~
      

  4.   

    对数据更新 3 可以显式指定更新所用的sql语句或储存过程