C# DataTable 批量数据处理 增、删、改


1.批量新增,采用高效的SqlBulkCopy

using (SqlBulkCopy sbc = new SqlBulkCopy(db.ConnectionString))
                {
                    sbc.DestinationTableName = dataTable.TableName;
                    sbc.BatchSize = dataTable.Rows.Count;
                    sbc.BulkCopyTimeout = 300;
                    sbc.WriteToServer(dataTable);
                }

2.批量新增、修改、删除,采用SqlDataAdapter,如下代码段可根据DataTable.RowState (关于RowState参考我的另一篇文章介绍)状态进行新增及删除,

但是发现 批量修改不好使,具体看第3点

SqlConnection conn = new SqlConnection(strConnection));         

      SqlCommand myCommand = new SqlCommand("select * from "+strTblName+" where 1=2"),(SqlConnection) conn);   

      SqlDataAdapter myAdapter = new SqlDataAdapter(myCommand );   

      SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter);     
      
      myAdapter.InsertCommand = myCommandBuilder .GetInsertCommand();

      myAdapter.UpdateCommand = myCommandBuilder .GetUpdateCommand();

     myAdapter.DeleteCommand = myCommandBuilder .GetDeleteCommand();

   try

    {

        lock(this)                             //处理并发情况(分布式情况)

       {

              conn.Open();

              myAdapter.Update(ds,strTblName);  

               conn.Close();

       }


 
 

3.解决SqlDataAdapter.update 无法批量修改的问题

DataSet ds = new DataSet();
            ds.Tables.Add(table);
            string _tableName = table.TableName;
            int result = 0;
            using (SqlConnection sqlconn = new SqlConnection(db.ConnectionString))
            {
                sqlconn.Open();

                //使用加强读写锁事务   
                SqlTransaction tran = sqlconn.BeginTransaction(IsolationLevel.ReadCommitted);
                try
                {

                    ds.Tables[0].AcceptChanges();
                    foreach (DataRow dr in ds.Tables[0].Rows)
                    {
                        //所有行设为修改状态   
                        dr.SetModified();
                    }
                    //为Adapter定位目标表   

                    SqlCommand cmd = new SqlCommand(string.Format("select * from {0} where {1}", _tableName, " 1=2"), sqlconn, tran);
                    SqlDataAdapter da = new SqlDataAdapter(cmd);
                    SqlCommandBuilder sqlCmdBuilder = new SqlCommandBuilder(da);
                    sqlCmdBuilder.ConflictOption = ConflictOption.OverwriteChanges;
                    da.AcceptChangesDuringUpdate = false;
                    string columnsUpdateSql = "";
                    SqlParameter[] paras = new SqlParameter[table.Columns.Count];
                    int parasIndex = 0;
                    //需要更新的列设置参数是,参数名为"@+列名"
                    for (int i = 0; i < table.Columns.Count; i++)
                    {
                        //此处拼接要更新的列名及其参数值
                        columnsUpdateSql += ("[" + table.Columns[i].ColumnName + "]" + "=@" + table.Columns[i].ColumnName + ",");
                        if (table.Columns[i].DataType.Name == "DateTime")
                        {
                            paras[i] = new SqlParameter("@" + table.Columns[i].ColumnName, SqlDbType.DateTime, 23, table.Columns[i].ColumnName);
                        }
                        else if (table.Columns[i].DataType.Name == "Int64")
                        {
                            paras[i] = new SqlParameter("@" + table.Columns[i].ColumnName, SqlDbType.NVarChar, 19, table.Columns[i].ColumnName);
                        }
                        else
                        {
                            paras[i] = new SqlParameter("@" + table.Columns[i].ColumnName, SqlDbType.NVarChar, 2000, table.Columns[i].ColumnName);
                        }
                    }
                    if (!string.IsNullOrEmpty(columnsUpdateSql))
                    {
                        //此处去掉拼接处最后一个","
                        columnsUpdateSql = columnsUpdateSql.Remove(columnsUpdateSql.Length - 1);
                    }
                    //此处生成where条件语句
                    string limitSql = ("[" + table.Columns[0].ColumnName + "]" + "=@" + table.Columns[0].ColumnName);
                    SqlCommand updateCmd = new SqlCommand(string.Format(" UPDATE [{0}] SET {1} WHERE {2} ", _tableName, columnsUpdateSql, limitSql));
                    //不修改源DataTable   
                    updateCmd.UpdatedRowSource = UpdateRowSource.None;
                    da.UpdateCommand = updateCmd;
                    da.UpdateCommand.Parameters.AddRange(paras);
                    //da.UpdateCommand.Parameters.Add("@" + table.Columns[0].ColumnName, table.Columns[0].ColumnName);
                    //每次往返处理的行数
                    da.UpdateBatchSize = table.Rows.Count;
                    result = da.Update(ds, _tableName);
                    ds.AcceptChanges();
                    tran.Commit();

                }
                catch(Exception ex)
                {
                    tran.Rollback();
                    throw ex;
                }
                finally
                {
                    sqlconn.Dispose();
                    sqlconn.Close();
                }


            }



你可能感兴趣的:(C# DataTable 批量数据处理 增、删、改)