【发布时间】:2012-04-14 04:33:07
【问题描述】:
我在使用 ADO.NET 和 Client Access 附带的 IBM.Data.DB2.iSeries 提供程序查询 iSeries 服务器时遇到了一个奇怪的极端情况。
我正在运行一个简单的查询:
SELECT col FROM table WHERE (col LIKE 'value' OR col LIKE 'value%') FETCH FIRST n ROWS ONLY
但是当值是 102 时,适配器会给出 IndexOutOfRange ONLY。使用 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),它解决了这个问题。
【问题讨论】:
标签: .net sql exception-handling ado.net ibm-midrange