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