【批量新增】-SqlBulkCopy語句
阿新 • • 發佈:2019-01-24
上篇部落格我們介紹了通過拼接sql字串的方法來對sql資料庫進行批量新增,但是通過語句拼接insert語句有個缺點,就是每次最多隻能新增1000條。當時我們另外一個介面也用到了批量新增,但是這個介面輕輕一點就需要新增上千條資料,這可如何是好呢,通過查詢,我找到了另外一種批量新增的方法,就是通過SqlBulkCopy語句來實現批量新增。
使用SqlBulkCopy語句的效率比使用insert語句來進行批量新增的速度更快,具體的資料我沒有記錄下來,但是從感覺上來說,效果很明顯。
那麼什麼是SqlBulkCopy語句呢?
Microsoft SQL Server 提供一個稱為 bcp 的流行的命令提示符實用工具,用於將資料從一個表移動到另一個表(表既可以在同一個伺服器上,也可以在不同伺服器上)。 SqlBulkCopy 類允許編寫提供類似功能的託管程式碼解決方案。還有其他將資料載入到 SQL Server 表的方法(例如 INSERT 語句),但相比之下 SqlBulkCopy 有明顯的效能優勢。
使用 SqlBulkCopy 類只能向 SQL Server 表寫入資料。但是,資料來源不限於 SQL Server;可以使用任何資料來源,只要資料可載入到 DataTable 例項或可使用 IDataReader 例項讀取資料。
如何使用SqlBulkCopy語句呢?
#region 批量新增DataTable /// <summary> /// 批量新增datatable /// </summary> /// <param name="data"></param> /// <returns></returns> public bool Insert(DataTable data) { try { //連線sql資料庫語句 using (SqlConnection conn = new SqlConnection("data source=.;initial catalog=YzSystem;persist security info=True;user id=sa;password=xxx;")) { if (conn.State != ConnectionState.Open) conn.Open(); using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(conn)) { // 列對映集合。 sqlBulkCopy.ColumnMappings.Add(0, "ID"); sqlBulkCopy.ColumnMappings.Add(1, "EvaluatorID"); sqlBulkCopy.ColumnMappings.Add(2, "CriticID"); sqlBulkCopy.ColumnMappings.Add(3, "IsEvaluated"); sqlBulkCopy.ColumnMappings.Add(4, "Weight"); sqlBulkCopy.ColumnMappings.Add(5, "Year"); sqlBulkCopy.ColumnMappings.Add(6, "EvaluationInfoID"); sqlBulkCopy.ColumnMappings.Add(7, "IsUsed"); // 每一批次中的行數。在每一批次結束時,將該批次中的行傳送到伺服器。 sqlBulkCopy.BatchSize = data.Rows.Count; // 超時之前操作完成所允許的秒數。 sqlBulkCopy.BulkCopyTimeout = 60; // 伺服器上目標表的名稱。 sqlBulkCopy.DestinationTableName ="YzSettingEvaluationEntity"; // 將data這個datatable中的表複製到目標表中。 sqlBulkCopy.WriteToServer(data); } if (conn.State != ConnectionState.Closed) conn.Close(); return true; } } catch (Exception ex) { return false; } } #endregion
之前一直用的拼接sql字串來進行批量新增,現在才發現有一種更方便快捷效能高的方法來做之前的工作,還能解決之前遇到的問題,不將就才是發現的原動力啊。