DbDataAdapter.Fill()数据集上的IndexOutOfRange异常

时间:2012-03-30 13:21:55

标签: .net sql exception-handling ado.net ibm-midrange

我在使用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时,适配器提供I​​ndexOutOfRange 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并安装所有Service Pack后,问题并没有消失。我最终通过使用(第三方)PEEK实用程序在我的表中找到损坏的数据,该实用程序抱怨某些字符处于无效范围(小于x'40'或等于x'FF')。关于这个工具的好处是用'%'自动替换无效字符,因此我能够找到无效数据,这在每个其他客户端/程序中都显示为空白(尝试过ODBC,STRSQL,UPDDTA)。

无效字符实际上是一个空字符(x'00'),.NET驱动程序似乎不喜欢它。

上次更新 IBM支持实际上向我指出了APAR (SE35276),它解决了这个问题。

2 个答案:

答案 0 :(得分:2)

我越是看到你遇到的问题,我越怀疑.net驱动程序。我从基于unix的系统中提取数据,并且当驱动程序得到它不期望的东西时经常遇到这样的问题。我的猜测是你的#102行有一些数据要么不适合缓冲区,要么具有驱动程序不希望在源处看到的数据类型。你有一些样本数据吗?如何一次拉出1列以查看失败的位置?

答案 1 :(得分:1)

尝试使用其他查询工具查看是否出现错误。我和@Rajiv在表中有一些不好的数据。并且不要在比其他基于PC的工具更不可能出现问题的系统上使用STRSQL命令。一个我认为被称为像松鼠的东西。