【问题标题】:IndexOutOfRange exception on DbDataAdapter.Fill() datasetDbDataAdapter.Fill() 数据集上的 IndexOutOfRange 异常
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 我已经只拉了一列。进一步的测试指出我使用“1023”进行搜索。列的数据类型是 char,手动运行查询会返回一个正常的数据集(它是我们销售的设备的序列号)。我会把数据放在我的问题中。
    • 另外,我正在更新我的客户端访问,因为我们刚刚将操作系统迁移到 v6r1(即使 CA v5r4 应该与操作系统 v6r1 兼容)以确保它不是兼容的。问题 beetwen CA 和操作系统
    • 我确信数据以某种方式被弄乱了。这通常是我遇到的一个例外,当我的源数据质量不佳或有人粗心大意时。如果它是 char 数据类型,任何人都可以在该字段中输入空格,而您不会知道它。我希望我对你有意义。
    • 请务必在安装 v6r1(或任何版本)后安装最新的服务包。
    • @RajivVarma :我当然希望有人是胖手指。不幸的是,数据来自条形码阅读器,而不是实际的人工输入......无论如何,我不能再做任何测试了,安装 v6r1 只是搞砸了一切,我的应用程序。甚至不会再跑了!
    【解决方案2】:

    尝试使用其他查询工具,看看是否有错误。我和@Rajiv 一起说表中有一些错误数据。并且不要在比其他基于 PC 的工具更不可能出现问题的系统上使用 STRSQL 命令。我相信一种叫做松鼠之类的东西。

    【讨论】:

    • 原来如此,无效数据。是否有机会知道可以以原始形式转储文件的工具?
    • 使用 SQL 可以查看十六进制数据。我不记得脑海中的命令,但快速搜索让我在几个月前找到了它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    相关资源
    最近更新 更多