1. 程式人生 > >【批量新增】-SqlBulkCopy語句

【批量新增】-SqlBulkCopy語句

     上篇部落格我們介紹了通過拼接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字串來進行批量新增,現在才發現有一種更方便快捷效能高的方法來做之前的工作,還能解決之前遇到的問題,不將就才是發現的原動力啊。