Я реализовал класс с использованием 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 и уменьшаться на единицу меньше количества столбцов. Пожалуйста, дайте мне знать, если кто-нибудь поможет мне найти причину.