2017-11-17 82 views
0

我已经实现了一个使用IDataReader的类作为使用SqlBulkCopy的项目的一部分。我已经发布了一些相关的代码在这里IDataReader实现中的索引值问题

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,索引的最终值比列数小1。由于这个问题,批量加载最终会跳过一列。

我无法找到为什么GetValue()中的索引没有将值从1递增到列数。实际上,这个值应该从0开始并且比列数少一个。请让我知道是否有人帮我找到原因。

回答

0

您不指定映射。因此默认SqlBulkCopy可能会尝试按数据库的顺序自动映射。

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

+1

太棒了!这是原因。我删除了标识列来验证,现在索引值从0开始并遍历所有列。我添加了一个列映射,以避免让SqlBulkCopy做猜测工作。 – wired2code