备忘录——关于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();//关闭连接
}
}