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();
- }
- }