批量往數據庫導入數據遇到的問題總結


  項目開發中,有個功能需要往數據庫批量插入數據,剛開始沒考慮那么多,就一條一條數據循環插入數據庫,數據量少的時候,效率還可以,但是當數據量達到上千甚至幾百時,這個方法效率就不行了,得等段時間才全部插入成功,用戶體驗度非常不好,果斷pass掉該方法。

  接着換令一種方法,那就是拼接insert字符串,即"Insert into TableName Values(' ',' ',' '),(' ',' ',' ');",剛開始還比較happy,插入速度很快,效率很高,可是當數據過千后,問題出現了,報錯了提示“INSERT 語句中行值表達式的數目超出了 1000 行值的最大允許值。”,我去,一次只能批量插入1000條數據,這也太坑了吧!要想繼續用這種方法,就必須循環數據,每次插入1000條,這樣得加各種判斷比較繁瑣,懶得加就繼續pass。

  就這樣兜兜轉轉找到了第三種方法,使用SqlBulkCopy類批量添加數據,經過查資料發現這個方法真是NB,百萬級的數據插入數據庫只用了十幾秒甚至幾秒,這效率簡直要上天呀!於是果斷用這個方法。下面是SqlBulkCopy類的簡單用法:

 public void BatchInsert(List<AdCarSerialEntity> list)
        {
            DataTable dt = DataFormat.ListToDataTable<AdCarSerialEntity>(list);

            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(WebConfig.DealerRW, SqlBulkCopyOptions.KeepIdentity))
            {
                //每一批次中的行數
                bulkCopy.BatchSize = 100000;
                //超時之前操作完成所允許的秒數
                bulkCopy.BulkCopyTimeout = 1800;

                //將DataTable表名作為待導入庫中的目標表名 
                bulkCopy.DestinationTableName = "AdCarSerials";

                //將數據集合和目標服務器庫表中的字段對應  
                for (int i = 1; i < dt.Columns.Count; i++)
                {
                    //列映射定義數據源中的列和目標表中的列之間的關系
                    bulkCopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
                }
                //將DataTable數據上傳到數據表中
                bulkCopy.WriteToServer(dt);
            }
        }

  這個方法不僅效率快,而且數據源不限,只要將數據加載到DataTable實例或者DataRow數組中都可以將數據批量插入數據庫。

  就這樣批量插入的問題愉快的解決了,以后再也不用擔心上萬級數據的批量插入效率問題了~~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM