項目開發中,有個功能需要往數據庫批量插入數據,剛開始沒考慮那么多,就一條一條數據循環插入數據庫,數據量少的時候,效率還可以,但是當數據量達到上千甚至幾百時,這個方法效率就不行了,得等段時間才全部插入成功,用戶體驗度非常不好,果斷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數組中都可以將數據批量插入數據庫。
就這樣批量插入的問題愉快的解決了,以后再也不用擔心上萬級數據的批量插入效率問題了~~~