问题
在批量导入.csv文件数据到数据库表的时候,由于表包含了一列自增列,所以csv文件中则没有添加这一列,所以在导入的时候遇到了插入失败的问题。(其实没问题,是程序报错看错了,白白搞了很久 TAT)
解决方案
一、设置映射
DataTable myDataTable = ioec.getDataTable(filePath, fileName);
SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(conn);
sqlBulkCopy.DestinationTableName = mydataTable.TableName;
for (int i = 0; i < dt.Columns.Count; i++)
{
sbc.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
}
sqlBulkCopy.WriteToServer(myDataTable);
参数myDataTable
不需要为自增列新增一列,从csv导出什么数据就是什么数据
关键部分是:
for (int i = 0; i < dt.Columns.Count; i++)
{
sbc.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
}
这一段代码,需要将数据源的列名和目标表的列名一一对应
二、为参数datatable新增一列,值为空
在datatable中加一列,数据为空,位置是第一列,因为填充的时候 会忽略第一列,这样就不需要映射了,但是datatable列的顺序必须和数据库表列的顺序一致!!否则会报错
三、为参数datatable新增一列,数据不为空
在datatable中加一列,然后从数据库表中查询目前最后一个自增id的值,设置这一列的AutoIncrement、AutoIncrementSeed
DataTable myDataTable = new DataTable("mkexams");
DataColumn newDataColumn = myDataTable.Columns.Add("id", Type.GetType("System.Int64"));
newDataColumn.AutoIncrement = true; //设置这一列自增
newDataColumn.AllowDBNull = false;
List<mkexams> mk = dbContext.mkexams.ToList();
long id = mk.Last().id + 1; //查出最后自增ID是多少
newDataColumn.AutoIncrementSeed = id; //启始值
newDataColumn.AutoIncrementStep = 1; //每次增长数
其中myDataTable
的这一列自增列的数值只需要设置为null
即可。例如:
myDataTable.Rows.Add(null, "第一行第二列数据", "第一行第三列数据");