SqlBulkCopy,微軟提供的快速插入類(lèi),針對(duì)大批量數(shù)據(jù)操作,此類(lèi)效果明顯有所提升,以下是微軟官方解釋?zhuān)?/span>
Microsoft SQL Server 提供一個(gè)稱(chēng)為 bcp 的流行的命令提示符實(shí)用工具,用于將數(shù)據(jù)從一個(gè)表移動(dòng)到另一個(gè)表(表既可以在同一個(gè)服務(wù)器上,也可以在不同服務(wù)器上)。SqlBulkCopy 類(lèi)允許編寫(xiě)提供類(lèi)似功能的托管代碼解決方案。還有其他將數(shù)據(jù)加載到 SQL Server 表的方法(例如 INSERT 語(yǔ)句),但相比之下 SqlBulkCopy 提供明顯的性能優(yōu)勢(shì)。
使用 SqlBulkCopy 類(lèi)只能向 SQL Server 表寫(xiě)入數(shù)據(jù)。但是,數(shù)據(jù)源不限于 SQL Server;可以使用任何數(shù)據(jù)源,只要數(shù)據(jù)可加載到 DataTable 實(shí)例或可使用 IDataReader 實(shí)例讀取數(shù)據(jù)。
要使用此類(lèi)一共需要用到三個(gè)步驟:
1.初始化數(shù)據(jù)源類(lèi)型,DataTable或DataRow,一般我們使用數(shù)據(jù)庫(kù)中的列名作為數(shù)據(jù)源的列名;

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.給數(shù)據(jù)源添加數(shù)據(jù):

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.打開(kāi)數(shù)據(jù)庫(kù)鏈接,批量插入數(shù)據(jù)源數(shù)據(jù):

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-------->為指定數(shù)據(jù)庫(kù)表名
sqlCopy.BulkCopyTimeout------------->指定完成時(shí)間
sqlCopy.ColumnMappings.Add--------->指定數(shù)據(jù)庫(kù)與數(shù)據(jù)源中的對(duì)應(yīng)關(guān)系
另外得注意的是,sqlCopy.ColumnMappings.Add指定對(duì)應(yīng)關(guān)系時(shí),一定要注意大小寫(xiě)要與數(shù)據(jù)庫(kù)一直,sqlCopy.ColumnMappings.Add是對(duì)大小寫(xiě)很敏感的,另外對(duì)應(yīng)的字段個(gè)數(shù)也必須一致,否則就會(huì)出現(xiàn)《給定的 ColumnMapping 與源或目標(biāo)中的任意列均不匹配。》錯(cuò)誤;
以上是個(gè)人見(jiàn)解,如有理解有誤的地方歡迎指出;
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注