SqlBulkCopy,微軟提供的快速插入類,針對大批量數據操作,此類效果明顯有所提升,以下是微軟官方解釋:
Microsoft SQL Server 提供一個稱為 bcp 的流行的命令提示符實用工具,用于將數據從一個表移動到另一個表(表既可以在同一個服務器上,也可以在不同服務器上)。SqlBulkCopy 類允許編寫提供類似功能的托管代碼解決方案。還有其他將數據加載到 SQL Server 表的方法(例如 INSERT 語句),但相比之下 SqlBulkCopy 提供明顯的性能優勢。
使用 SqlBulkCopy 類只能向 SQL Server 表寫入數據。但是,數據源不限于 SQL Server;可以使用任何數據源,只要數據可加載到 DataTable 實例或可使用 IDataReader 實例讀取數據。
要使用此類一共需要用到三個步驟:
1.初始化數據源類型,DataTable或DataRow,一般我們使用數據庫中的列名作為數據源的列名;
1 DataTable dtCopy = new DataTable();2 dtCopy.Columns.Add("jhsSitid");3 dtCopy.Columns.Add("applyGoodsId");4 dtCopy.Columns.Add("ghsSitid");5 dtCopy.Columns.Add("state");6 dtCopy.Columns.Add("applyTime");
2.給數據源添加數據:
1 foreach (DataRow r in ds.Tables[0].Rows) 2 { 3 DataRow newRow = dtCopy.NewRow(); 4 newRow["jhsSitid"] = r["sitid"].ToString(); 5 newRow["applyGoodsId"] = goodsId; 6 newRow["ghsSitid"] = siteId; 7 newRow["state"] = "0"; 8 newRow["applyTime"] = DateTime.Now; 9 dtCopy.Rows.Add(newRow);10 }
3.打開數據庫鏈接,批量插入數據源數據:
1 SqlConnection conn = new SqlConnection(baseclass.connectionString); 2 if (conn.State == ConnectionState.Closed) 3 { 4 conn.Open(); 5 } 6 SqlTransaction st = conn.BeginTransaction(); 7 using (SqlBulkCopy sqlCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.FireTriggers, st)) 8 { 9 sqlCopy.DestinationTableName = "jhQQ_list";10 sqlCopy.BulkCopyTimeout = 60;11 sqlCopy.ColumnMappings.Add("jhsSitId", "jhsSitId");12 sqlCopy.ColumnMappings.Add("applyGoodsId", "applyGoodsId");13 sqlCopy.ColumnMappings.Add("ghsSitId", "ghsSitId");14 sqlCopy.ColumnMappings.Add("state", "state");15 sqlCopy.ColumnMappings.Add("applyTime", "applyTime");16 try17 {18 sqlCopy.WriteToServer(dtCopy);19 st.Commit();20 result = true;21 }22 catch (Exception ex)23 {24 st.Rollback();25 }26 finally27 {28 conn.Close();29 }30 }
sqlCopy.DestinationTableName-------->為指定數據庫表名
sqlCopy.BulkCopyTimeout------------->指定完成時間
sqlCopy.ColumnMappings.Add--------->指定數據庫與數據源中的對應關系
另外得注意的是,sqlCopy.ColumnMappings.Add指定對應關系時,一定要注意大小寫要與數據庫一直,sqlCopy.ColumnMappings.Add是對大小寫很敏感的,另外對應的字段個數也必須一致,否則就會出現《給定的 ColumnMapping 與源或目標中的任意列均不匹配。》錯誤;
以上是個人見解,如有理解有誤的地方歡迎指出;
新聞熱點
疑難解答