Проблема со значением индекса в реализации IDataReader

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


person wired2code    schedule 17.11.2017    source источник


Ответы (1)


Вы не указываете сопоставление. Таким образом, по умолчанию SqlBulkCopy может попытаться выполнить автоматическое сопоставление с базой данных по порядковому номеру.

Например, если ваш первый столбец в базе данных является столбцом идентификаторов (что имеет большой шанс быть таковым), он пропустит index 0 и вместо этого начнет с index 1.

person Jonathan Magnan    schedule 18.11.2017
comment
Потрясающий! Это было причиной. Я удалил столбец идентификатора для проверки, и теперь значения индекса начинаются с 0 и проходят через все столбцы. Я добавил сопоставление столбцов, чтобы SqlBulkCopy не выполнял свою догадку. - person wired2code; 20.11.2017