ADO.NETとClient Accessに付属のIBM.Data.DB2.iSeriesプロバイダーを使用してiSeriesサーバーを照会する際に、私は変なコーナーケースを実行しています。DbDataAdapter.Fill()データセットのIndexOutOfRange例外
SELECT col FROM table WHERE (col LIKE 'value' OR col LIKE 'value%') FETCH FIRST n ROWS ONLY
をしかし、アダプタは値がある場合にのみ、私の場合には、102が通常101点のまたは103作品と同じクエリを実行IndexOutOfRange を与える:
私は単純なクエリを実行していますよ。私は、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に移行してすべてのサービスパックをインストールした後、問題は解決されませんでした。私は、無効な範囲(x'40 '以下またはx'FF'以下)にある文字について不平を言った(サードパーティの)PEEKユーティリティを使用して、テーブル内の破損したデータを見つけることになりました。このツールの素晴らしい点は、自動的に無効な文字を '%'で置き換えることです。無効なデータは、他のすべてのクライアント/プログラム(ODBC、STRSQL、UPDDTA)で空白として表示されます。
無効な文字は、実際にはNULL文字(x'00 ')であり、.NETドライバでは好まれません。
最終更新 IBMサポートは、この問題を解決するこのAPAR (SE35276)を実際に指摘しました。
私は既に1つの列を引っ張っています。さらなるテストでは、「1023」を使用した検索がわかりました。列のデータ型はcharであり、手動で実行すると、通常のデータセット(販売するデバイスのシリアル番号)が返されます。私の質問にデータを入れてください。 –
さらに、OSをv6r1(CA v5r4はOS v6r1と互換性があると思われますが)に移行して以来、私はクライアントアクセスを更新しています。beetwen CAとOSを発行してください –
私は、データが何らかの形で混乱していると確信しています。これは、通常、私のソースデータが良質でないか、誰かが脂肪を指差しているときに私が出会ったという例外です。そのcharデータ型の場合、誰でもそのフィールドに空白を入れて、それについて知ることはできません。私はあなたに意味をなさないことを願っています。 – rvphx