備忘錄——關於SqlBulkCopy批量插入數據的注意事項
0. 關於列順序
-
SqlBulkCopy不是根據表的ColumnName來匹配的,而是根據ColumnIndex匹配
- 所以Datatable的列順序必須和數據庫表中的列的順序一致
- Datatable中列和Table中列從前往後對應,數據庫中的Table列可以比Datatable多
- 若是需要插入的列的中間某一列不需要插入,也需要在Datatable中顯示的構造出來,不賦值即可
-
SqlBulkCopy可以顯示的設定Datatable也表Table中的列的映射關係
- 使用:SqlBulkCopyColumnMapping
- 我的使用場景非常單一,還是儘量構造與Table一直的Datatable對象吧
1. 關於自增主鍵的處理
-
方法1:可以將自增主鍵放在最後一列,此時批量插入的Datatable不需要插入該列
-
方法2:Datatable 需要添加該自增主鍵列,但是不需要賦值
2.關於字段類型
- Datatable中列的類型,若是動態構造Datatable,需要顯示的設置列的類型,和數據中字段類型一致
3.簡單的批量插入方法
/// <summary>
/// 使用SqlBulkCopy將DataTable中的數據批量插入數據庫中
/// </summary>
/// <param name="dbTableName">數據庫中對應的表名</param>
/// <param name="dtData">數據集</param>
public static void SqlBulkCopyInsert(string dbTableName, DataTable dataTable)
{
using (SqlBulkCopy sqlRevdBulkCopy = new SqlBulkCopy(GetConnection()))//引用SqlBulkCopy
{
sqlRevdBulkCopy.DestinationTableName = dbTableName;//數據庫中對應的表名
sqlRevdBulkCopy.NotifyAfter = dataTable.Rows.Count;//有幾行數據
sqlRevdBulkCopy.WriteToServer(dataTable);//數據導入數據庫
sqlRevdBulkCopy.Close();//關閉連接
}
}