时间:2021-07-01 10:21:17 帮助过:1人阅读
其次,使用SqlBulkCopy类把数据放数据库。SqlBulkCopy.WriteToServer()提供了4种重载方式,如下:
public void WriteToServer(DataRow[] rows);
public void WriteToServer(DataTable table);
public void WriteToServer(IDataReader reader);
public void WriteToServer(DataTable table, DataRowState rowState);
显然第二种最简单粗暴,大家都喜欢的。也就是上面的代码为什么要返回DataTable了。在新建SqlBulkCopy实例时,可以由SqlBulkCopyOptions来设置插入时的检查约束、锁表、触发器、每批次事务等操作。sqlBC.DestinationTableName是DB中要插入数据的表名。sqlBC.BatchSize是每一批次放入数据库的数据量。
默认情况下,SqlBulkCopy会认为源数据DataTable的列与目标表的列是一一对应的,一旦两者有所不同(列数或列名不一致)则会插入失败并报错。所以,我们需要用public SqlBulkCopyColumnMapping Add(string sourceColumn, string destinationColumn)来添加源列名与目标列名的对应关系。数据格式不用做匹配,SqlBulkCopy会帮忙转换。当然,用非时间格式的string转换成DateTime这种情况毫无疑问的报错。最后,qlBC.WriteToServer()收工。
#region 把数据写入数据库 /// <summary> /// 把数据写入数据库 /// </summary> /// <param name="tableName">数据库表名</param> /// <param name="dt">数据</param> /// <returns></returns> public bool WriteToServer(string tableName,DataTable dt) { bool execResult = false; SqlConnection sqlCon = new SqlConnection(SqlConnectionString); sqlCon.Open(); SqlTransaction sqlTran = sqlCon.BeginTransaction(); // 开始事务 SqlBulkCopy sqlBC = new SqlBulkCopy(sqlCon, SqlBulkCopyOptions.Default, sqlTran); sqlBC.DestinationTableName = tableName; sqlBC.BatchSize = 10000; for (int i = 0; i < dt.Columns.Count; i++) { sqlBC.ColumnMappings.Add(dt.Columns[i].ColumnName,dt.Columns[i].ColumnName); } try { sqlBC.WriteToServer(dt); sqlTran.Commit(); execResult = true; } catch (Exception ex) { execResult = false; sqlTran.Rollback(); MessageBox.Show("数据库错误:" + ex.Message); } finally { sqlBC.Close(); sqlCon.Close(); } return execResult; } #endregion
相关文章:http://www.cnblogs.com/zfanlong1314/archive/2013/02/05/2892998.html
既是推荐也是我自己的mark。
C#/.NET使用HttpWebRequest、SqlBulkCopy从API获取数据批量插入DB
标签: