我使用IDataReader实现了一个类,它是使用SqlBulkCopy的项目的一部分。我在这里发布了一些相关的代码
public bool Read()
{
var result = !fileStream.EndOfStream;
if (result)
{
delimRow = fileStream.ReadLine();
splitRowValues = delimRow.Split(_delimiters);
readRowCount++;
}
return result;
}
private string[] Row
{
get { return splitRowValues; }
}
public object GetValue(int i)
{
return Row[i];
}
使用SqlBulkCopy和IDataReader
的代码段SqlBulkCopy bulkInsert = new SqlBulkCopy(Constants.DBConnection, SqlBulkCopyOptions.UseInternalTransaction);
bulkInsert.BatchSize = 500;
bulkInsert.DestinationTableName = Constants.DestinationTable;
bulkInsert.WriteToServer(reader);
当运行WriteToServer方法时,我注意到第一次调用GetValue()时,索引值为1,索引的最终值小于列数。由于此问题,批量加载最终会跳过一列。
我无法找到为什么GetValue()中的索引不会将值从1计数到列数。实际上,该值应该从0开始并且比列数少一个。如果有人帮我找到原因,请告诉我。
答案 0 :(得分:0)
您没有指定映射。因此,默认情况下SqlBulkCopy
可能会尝试按顺序对数据库进行自动化。
例如,如果数据库中的第一列是标识列(很有可能是这种情况),它将跳过index 0
并从index 1
开始。