【C#經常使用方法】3.將DataTable一次性插入數據庫表中(使用SqlBulkCopy)

將DataTable一次性插入數據庫表中(使用SqlBulkCopy)

1.SqlBulkCopy簡介


 

  SqlBulkCopy類是ADO.NET中專門用於數據庫批量插入數據的類,其批量插入的執行速度是其餘相似操做類中最快的。SqlBulkCopy類在批量插入數據時,不用去像傳統插入操做那樣先拼寫出sql語句再對sql語句進行執行,而是能夠直接將一個DataTable插入數據庫的目標表中。sql

  關於SqlBulkCopy類的用法詳見下面例子2。數據庫

 

2.將DataTable一次性插入數據表中


 

(1)方法代碼

  直接上功能代碼,代碼中的註釋很詳細:app

    class DBHelper { /// <summary>
        /// 使用sqlBulkCopy將DataTable一次性插入數據庫 /// </summary>
        /// <param name="dt">DataTable</param>
        /// <param name="tableName">要插入的數據庫表名稱</param>
        /// <param name="colMapping">DataTable與數據庫表中列的對應關係,key:爲DataTable的列名,value:數據庫表的列名</param>
        /// <returns></returns>
        public static bool InsertDataTableToDB(DataTable dt, string tableName, Dictionary<string, string> colMapping) { try { string connStr = "Server=.;Database=TestDB;uid=sa;pwd=songge";//鏈接字符串 //使用SqlBulkCopy可省略SqlConnection,直接將鏈接字符串賦給它(固然也能夠不省略),第二個參數表示打開事物(一步操做失敗那麼全部操做回滾)
                using (SqlBulkCopy bc = new SqlBulkCopy(connStr, SqlBulkCopyOptions.UseInternalTransaction)) { //添加DataTable每列與數據表每列的對應關係
                    foreach (var item in colMapping) { bc.ColumnMappings.Add(item.Key, item.Value); } bc.BatchSize = dt.Rows.Count;//設置每次插入的數據量
                    bc.DestinationTableName = tableName;//設置目標表(要插入到哪一個數據庫表)
                    bc.WriteToServer(dt);//執行插入
                    return true; } } catch (Exception ex) { return false; } } }

 

(2)使用方法

  首先在數據庫新建一個測試表,名稱爲TestTable1,表結構以下所示:測試

  

  重點解釋:將一個DataTable插入數據庫時,若是設置了ColumnMappings(即設置了DataTable列與數據庫表列的對應關係),那麼在插入時只插入綁定了的列,若是不設置ColumnMappings,那麼若是想用SqlBulkCopy將DataTable插入數據庫,那麼這個DataTable的結構必須與數據庫表的結構相同(列名相同,好像順序與列的數量也得相同,我沒測試)。ui

        private void button_Click(object sender, RoutedEventArgs e) { //初始化一個要插入數據表的DataTable
            DataTable dt = new DataTable(); dt.Columns.Add("a", typeof(string)); dt.Columns.Add("b", typeof(string)); dt.Columns.Add("c", typeof(int)); dt.Columns.Add("x", typeof(string)); dt.Columns.Add("Cc", typeof(string)); //設置與數據庫表的對應關係,由於DataTable只綁定了數據庫表的三列,因此在插入時,只插入綁定的這三列
            Dictionary<string, string> colMapping = new Dictionary<string, string>(); colMapping.Add("c", "Cf"); colMapping.Add("b", "Ca"); colMapping.Add("a", "Cb"); //插入10條測試數據
            for (int i=0;i<10;i++) { dt.Rows.Add(dt.NewRow().ItemArray = new object[] { "a", "b" , i, "x","Cc"}); } //執行方法
            DBHelper.InsertDataTableToDB(dt, "TestTable1", colMapping); }

  執行結果:spa