SqlBulkCopy批量插入數據

需求:讀取傳入的DataSet,將DataSet裏的DataTable插入數據庫

分析:

1.數據量大,不推薦循環sql insert

2.多表操作,事務

  /// <summary>
        /// 添加數據
        /// </summary>
        /// <returns></returns>
        public static void AddTaxInfo(DataSet infoSet)
        {
            using (var conn = new SqlConnection(_connectionString))
            {
                conn.Open();
                SqlTransaction sqlbulkTransaction = conn.BeginTransaction();

                try
                {
                    //插入主表
                    using (var bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.CheckConstraints, sqlbulkTransaction))
                    {
                        var table_Main = infoSet.Tables["Core_TaxMain"];
                        foreach (DataColumn dc in table_Main.Columns)
                        {
                            bulkCopy.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);
                        }
                        bulkCopy.DestinationTableName = "Core_TaxMain";
                        //複製Table
                        bulkCopy.WriteToServer(table_Main);
                    }
                    //插入系表
                    using (var bulkCopy_ = new SqlBulkCopy(conn, SqlBulkCopyOptions.CheckConstraints, sqlbulkTransaction))
                    {
                        var table_Detail = infoSet.Tables["Core_TaxDetail"];
                        foreach (DataColumn dc in table_Detail.Columns)
                        {
                            bulkCopy_.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);
                        }
                        bulkCopy_.DestinationTableName = "Core_TaxDetail";

                        bulkCopy_.WriteToServer(table_Detail);
                    }
                    //一個事務
                    sqlbulkTransaction.Commit();
                }
                catch (Exception)
                {
                    sqlbulkTransaction.Rollback();
                    throw;
                }
            }
        }

改進:上面的方法完全能夠滿足需求,只是創建bulkcopy對象顯得重複,於是把數據庫連接對象封裝了一下。

封裝好的類將寫在另一篇博客裏自己寫的數據庫工具類,這裏直接調用:

public static void AddTaxInfo(DataSet infoSet)
        {
            var table_Main = infoSet.Tables["Core_TaxMain"];//主表
            var table_Detail = infoSet.Tables["Core_TaxDetail"];//系表
            using (SqlAccess client = new SqlAccess(_connectionString))//SqlAcess是封裝類,類似SqlHelper
            {
                client.BeginTransaction();

                foreach (DataColumn dc in table_Main.Columns)
                {
                    client.BulkCopyColumnMapping.Add(dc.ColumnName, dc.ColumnName);
                }

                client.SetBulkCopy("a").WriteToServer(table_Main);

                foreach (DataColumn dc in table_Detail.Columns)
                {
                    client.BulkCopyColumnMapping.Add(dc.ColumnName, dc.ColumnName);
                }

                client.SetBulkCopy("b").WriteToServer(table_Detail);

                client.Commit();
            }



發佈了45 篇原創文章 · 獲贊 9 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章