問題
在批量導入.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, "第一行第二列數據", "第一行第三列數據");