3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

(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 を使い、ここで宣言したパラメータ変数(?)の順番で、パラメータを設定すればいいようです。

この原因探るのに数時間かかりました。この現象気付く人も結構少ないんじゃないでしょうか。。

バグってのはほんと勘弁してほしいですよね。