2012-03-30 6 views
0

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)を実際に指摘しました。

答えて

2

私が問題に遭遇していることが分かるほど、.netドライバが疑わしいほどです。私はUnixベースのシステムからデータを引き出し、ドライバが何かを期待していないときに頻繁にこのような問題にぶつかります。私の推測では、あなたの行#102には、バッファに適合しないか、またはドライバがソースで見ることを期待していないデータ型があるデータがいくつかあります。サンプルデータがありますか?どのように失敗するかを見るために一度に1つの列を引っ張ってみるのはいかがですか?

+0

私は既に1つの列を引っ張っています。さらなるテストでは、「1023」を使用した検索がわかりました。列のデータ型はcharであり、手動で実行すると、通常のデータセット(販売するデバイスのシリアル番号)が返されます。私の質問にデータを入れてください。 –

+0

さらに、OSをv6r1(CA v5r4はOS v6r1と互換性があると思われますが)に移行して以来、私はクライアントアクセスを更新しています。beetwen CAとOSを発行してください –

+1

私は、データが何らかの形で混乱していると確信しています。これは、通常、私のソースデータが良質でないか、誰かが脂肪を指差しているときに私が出会ったという例外です。そのcharデータ型の場合、誰でもそのフィールドに空白を入れて、それについて知ることはできません。私はあなたに意味をなさないことを願っています。 – rvphx

1

他のクエリツールを使用してエラーが発生していないかどうかを確認してください。私は@ Rajivと一緒にテーブルに悪いデータがあると思っています。他のPCベースのツールよりも問題の少ないシステムでは、STRSQLコマンドを使用しないでください。私が信じているのは、リスのようなものです。

+0

だから、無効なデータです。ファイルを生の形式でダンプする可能性のあるツールを知る機会がありますか? –

+1

SQLでは、データを16進数で表示できます。私は頭の上から命令を覚えていないが、迅速な検索で数ヶ月前にそれを見つけることができた。 –

+0

ありがとう!それはHEX()です。 –