IDataReader 实现中的索引值问题
Index value issue in IDataReader implementation
我在使用 SqlBulkCopy 的项目中使用 IDataReader 实现了 class。我在这里发布了一些相关代码
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 开始,比列数少 1。如果有人帮我找到原因,请告诉我。
您没有指定映射。所以默认情况下 SqlBulkCopy
可能会尝试按数据库的顺序自动映射。
例如,如果数据库中的第一列是标识列(很有可能是这种情况),它将跳过 index 0
并从 index 1
开始。
我在使用 SqlBulkCopy 的项目中使用 IDataReader 实现了 class。我在这里发布了一些相关代码
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 开始,比列数少 1。如果有人帮我找到原因,请告诉我。
您没有指定映射。所以默认情况下 SqlBulkCopy
可能会尝试按数据库的顺序自动映射。
例如,如果数据库中的第一列是标识列(很有可能是这种情况),它将跳过 index 0
并从 index 1
开始。