C# 使用SqlBulkCopy 复制数据到含自增列的表时的问题

问题

在批量导入.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, "第一行第二列数据", "第一行第三列数据");
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章