Исключение IndexOutOfRange для набора данных DbDataAdapter.Fill () - PullRequest
0 голосов
/ 30 марта 2012

Я сталкиваюсь со странным угловым случаем, когда запрашиваю сервер iSeries, используя ADO.NET и поставщика IBM.Data.DB2.iSeries, который поставляется с Client Access.

Я работаю с простымquery:

SELECT col FROM table WHERE (col LIKE 'value' OR col LIKE 'value%') FETCH FIRST n ROWS ONLY

Но адаптер выдает IndexOutOfRange ONLY , когда значение в моем случае равно 102. Выполнение того же запроса с 101 или 103 работает нормально.Я проверил набор результатов, выполнив запрос непосредственно в iSeries, он отлично работает, и возвращенные строки не имеют ничего отличного от того, что я получу при выполнении запроса с другим значением.

Псевдокод, выполняющий запросвыглядит следующим образом:

String query = '...' // See above query

IDbDataAdapter adapter = new iDB2DataAdapter(query, connection)
DataSet ds = new DataSet()

adapter.Fill(ds) // IndexOutOfRangeException only a certain values

Пример данных, которые должны быть возвращены:

1023 29134 
1023       
1023029039 

Примечание Также найден пустой символ (и другие специальные символы)в исправных наборах результатов, поэтому я склонен полагать, что это не является причиной проблемы.

Трассировка стека исключения

at IBM.Data.DB2.iSeries.iDB2DataReader.GetDcRow(IntPtr dataPtr, Int32 row, MpDcData[] dcData, UInt32 block)
at IBM.Data.DB2.iSeries.iDB2DataReader.GetValues(Object[] values)
at System.Data.ProviderBase.DataReaderContainer.CommonLanguageSubsetDataReader.GetValues(Object[] values)
at System.Data.ProviderBase.SchemaMapping.LoadDataRow()
at System.Data.Common.DataAdapter.FillLoadDataRow(SchemaMapping mapping)
at System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
at System.Data.Common.DataAdapter.Fill(DataSet dataSet, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)

Обновление Выребята были правы, спасибо за вашу помощь.После миграции драйвера на v6r1 и установки всех пакетов обновления проблема не исчезла.В итоге я нашел поврежденные данные в своей таблице с помощью (сторонней) утилиты PEEK, которая жаловалась на то, что некоторые символы находятся в недопустимом диапазоне (меньше x'40 'или равно x'FF').Приятной особенностью этого инструмента является то, что он автоматически заменяет недопустимые символы на «%», поэтому я смог найти недопустимые данные, которые отображаются как пустые во всех других клиентах / программах (пробовал ODBC, STRSQL, UPDDTA).

Недопустимый символ был на самом деле нулевым символом (x'00 '), который, похоже, не подходит драйверу .NET.

Последнее обновление Фактически указана поддержка IBMмне этот APAR (SE35276) , который решает проблему.

Ответы [ 2 ]

2 голосов
/ 30 марта 2012

Чем больше я вижу проблему, с которой вы сталкиваетесь, тем больше я сомневаюсь в драйвере .net.Я перетаскиваю данные из системы на основе Unix и часто сталкиваюсь с такими проблемами, когда драйвер получает что-то, чего он не ожидает.Я предполагаю, что ваша строка # 102 содержит некоторые данные, которые либо не помещаются в буфер, либо имеют тип данных, который драйвер не ожидает увидеть в источнике.Будете ли вы иметь некоторые данные образца?Как насчет попытки вытащить 1 столбец за раз, чтобы увидеть, где он терпит неудачу ??

1 голос
/ 31 марта 2012

Попробуйте использовать другие инструменты запросов, чтобы увидеть, есть ли там ошибки.Я с @Rajiv, что есть некоторые плохие данные в таблице.И не используйте команду STRSQL в системе, которая с меньшей вероятностью будет иметь проблемы, чем другие инструменты для ПК.Тот, кого я считаю, называется что-то вроде Белки.

...