【问题标题】:Index value issue in IDataReader implementationIDataReader 实现中的索引值问题
【发布时间】:2017-11-17 23:21:05
【问题描述】:

我已经使用 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 的代码 sn-p

SqlBulkCopy bulkInsert = new SqlBulkCopy(Constants.DBConnection, SqlBulkCopyOptions.UseInternalTransaction);
bulkInsert.BatchSize = 500;
bulkInsert.DestinationTableName = Constants.DestinationTable;
bulkInsert.WriteToServer(reader);

运行 WriteToServer 方法时,我注意到第一次调用 GetValue() 时索引值为 1,并且索引的最终值比列数小一。由于这个问题,批量加载最终会跳过一列。

我无法找到为什么 GetValue() 中的索引不采用从 1 到列数的值。实际上,该值应该从 0 开始,并且比列数少一。如果有人帮我找到原因,请告诉我。

【问题讨论】:

    标签: c# sqlbulkcopy idatareader


    【解决方案1】:

    您没有指定映射。所以默认情况下SqlBulkCopy 可能会尝试按序号与数据库进行自动映射。

    例如,如果您在数据库中的第一列是标识列(很有可能是这种情况),它将跳过 index 0 并以 index 1 开头。

    【讨论】:

    • 太棒了!这就是原因。我删除了标识列进行验证,现在索引值从 0 开始并遍历所有列。我添加了一个列映射以避免让 SqlBulkCopy 进行猜测工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 2017-10-28
    • 2021-12-05
    相关资源
    最近更新 更多