C# DataTable 批量数据处理 增、删、改
2013-11-28 09:52
615 查看
1.批量新增,采用高效的SqlBulkCopy
2.批量新增、修改、删除,采用SqlDataAdapter,如下代码段可根据DataTable.RowState (关于RowState参考我的另一篇文章介绍)状态进行新增及删除,
但是发现 批量修改不好使,具体看第3点
3.解决SqlDataAdapter.update 无法批量修改的问题
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(); } }
相关文章推荐
- Oracle批量逐条数据处理
- Flink 另外一个分布式流式和批量数据处理的开源平台
- 【数据处理】文件批量改名
- MySql 批量进行数据处理 存储化
- 存储过程进行批量数据处理
- C#批量数据处理SqlBulkCopy
- 如何更快地批量数据处理?
- 一种动态构建PLSQL包进行批量数据处理的方法
- 简单的NHibernate helper类,支持同一事务的批量数据处理
- Struts 1.x中批量封装对象,多行数据处理两种方法
- C# DataTable 批量数据处理 增、删、改
- Code Fragment- 批量的数据处理放到额外的线程里
- C语言-第五章、用数组实现批量数据处理
- 简单的NHibernate helper类,支持同一事务的批量数据处理
- DB2存储过程通过游标实现批量数据处理
- 如何更快地批量数据处理?
- 关于Spring管理Hibernate的批量数据处理
- 根据批量URL生成有书签的PDF文档的解决方案
- 关于c#修改word模板并批量保存到客户端的问题
- 批量删除本地指定扩展名文件工具