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

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

AccessとOLEDB JET経由でLIKE文のワイルドカードが変わる

Access で LIKE 演算子で0文字以上の文字を表す時は * を使いますよね。

ところが、JETエンジン使って mdb にアクセスする OLEDB経由の ADO.Net だと % という純粋なSQLに近い形しないとダメなようです。

/*Accessだとヒットする。 OLEDB経由だとヒットしない*/

SELECT *

FROM Customer

WHERE Address LIKE '*京都*'

 

/*Accessだとヒットしない。 OLEDB経由だとヒットする*/

SELECT *

FROM Customer

WHERE Address LIKE '%京都%'

Access でテスト用のクエリを書いて、.Net のコードに移植してたんですが、これに気付かずちょっとハマってしまいした。

Visual Studio 上のサーバエクスプローラから mdf ファイルを指定し、クエリたたけば OLEDB 経由になるので、これからはこっち使ったほうが安全ですね。

この仕様については、Microsoft Jet SQL と ANSI SQL との比較で解説されてます。

下記の引用部分が、その仕様について言ってるところですね。

ANSI SQLワイルドカード文字を使用できるのは、Jet 4.x と Microsoft OLE DB Provider for Jet を組み合わせて使う場合だけです。Microsoft Access または DAO を介して ANSI SQLワイルドカード文字を使うと、リテラルとして解釈されます。Microsoft OLE DB Provider for Jet と Jet 4.x を使用しているときは、Jet SQLワイルドカード文字がリテラルとして解釈されます。