人気ブログランキング | 話題のタグを見る
(ADO.Net)OLEDB経由でのMDBへの副問い合わせにパラメータクエリを使うとおかしくなることがある

OleDbCommand , OleDbDataAdapter オブジェクトを使って、SQLクエリを書いたんですが、どうも挙動がおかしいのです。
SQLには WHERE,FROM 句の中で副問い合わせ(サブクエリ)を多数使い、サブクエリ内で OleDbParameter を使いパラメータで抽出条件となる値を設定してます。

で、サブクエリを書いた位置によって、「抽出条件でデータ型が一致しません。」とかいうエラーがでたり、明らかに条件に一致するデータがあるのに抽出できなかったりとするのです。

どうやら何かの原因でパラメータの順序が入れ替わっているようです。
(もともと OLEDB のパラメータクエリは、プレースホルダを ? で表現し、OleDbCommand.Parameters に追加した順番で適用されます。)

いろいろ検索してると、MSサポート:OLE DB Provider for Jet 4.0 または Office 12.0 Access Database Engine OLE DB Provider を使用時にサブ クエリを持つパラメータ クエリを実行すると、予期しない結果を返す場合があるというのを見つけました。

どうやら、この問題は JET のバグっぽいですね。

対策としては、上記のページにあるようにメインのSQLクエリの前に
PARAMETERS p1 Text,p2 Long; SLECT ....
という感じで PARAMETERS を使い、ここで宣言したパラメータ変数(?)の順番で、パラメータを設定すればいいようです。


この原因探るのに数時間かかりました。この現象気付く人も結構少ないんじゃないでしょうか。。
バグってのはほんと勘弁してほしいですよね。
by jehoshaphat | 2009-07-28 22:46 | .Net開発


<< (Firefox)「メモリが不... スリープ状態が有効にならない >>