たまにはMicrosoft Access(以下、Access)の技術的なネタでも書いてみようと思います。
今回はAccessとADO(ActiveX Data Objects)で使うワイルドカードが異なることで大はまりした内容です。その詳細は下記を。
ワイルドカードとは
まず、ワイルドカードというのは何かというと、検索などで名前を指定するときに「任意の文字」を指定するときに使う文字(記号)をワイルドカードといいます。
例えばAccessのクエリでUserテーブルのname(名前)フィールドに「村」の文字が先頭に含まれているデータを探す場合はクエリのデザインで下記のような設定を行います。

「村」が先頭に含まれるUserを探すクエリ
このクエリをSQL文で表示すると下記のようになります。
SELECT * FROM User Where User.name LIKE ‘村*’;
ここで書かれている「User.name LIKE ‘村*’」の部分は先頭に「村」の文字が有り、それ以降は任意の文字があるnameを探すという意味になります。ここの「*」がワイルドカードで任意の文字を意味します。
AccessとADOではワイルドカードが違う!
Access以外のデータベースを使っている人にとっては、これだけを見て「?」と思う方も多いと思います。それはAccessとADOなどの一般的なデータベースとワイルドカードが異なるのです。それを表にすると下記のようになります。
Access | ADO | |
---|---|---|
任意の数の文字 | * | % |
任意の1文字 | ? | _ |
なぜ、ワイルドカードが異なるのかはわかりませんが、全然違う記号を使っています。
ワイルドカードが異なるためにはまった例
このワイルドカードが異なることによって大きくはまりました。下記VBAを見てください。
Public Function test() As Integer
Dim con As New ADODB.Connection
Dim rcs As New ADODB.Recordset
Dim sql As String
Dim cnt As Integer
Set con = CurrentProject.Connection
sql = "SELECT * FROM User WHERE " & Me.Filter & ";"
rcs.Open sql, con, adOpenKeyset, adLockPessimistic
cnt = rcs.RecordCount
rcs.Close: Set rcs = Nothing
con.Close: Set con = Nothing
test = cnt
End Function
簡単にプログラムの説明をするとフォームのフィルターをそのままSQLの条件に入れて、検索した結果数を返すというちょっと強引なプログラムです。実際にはまったプログラムはちょっと違うのですが、これで説明はできます。
今回、はまったというのは察しがつく人もいると思いますが、フォームの条件にワイルドカードが使われていると、想定していた検索結果とは異なる結果が返ってきます。例えばフォームの条件(Me.Filter)に「User.name Like ‘村*’」と入っていると、ADOのワイルドカードは「%」なので、「*」のワイルドカードを使っても「村*」の文字を探してしまうのです。つまり、結果は全然違います。
原因がわかってしまえばたいしたことは無いのですが、これに気がつくのには大変でした。Accessでワイルドカードを使うときは気をつけましょうね。特にADOとの混合の場合は!
ADO実践講座―Windowsデータベースプログラミング (DB selection―Windowsデータベースプログラミング) 本
価格¥3,800
順位1,081,070位
著ウィリアム・R. ボーン
監修善博, 河端
原著Vaughn,William R.
翻訳里佳, 竹内
発行翔泳社
発売日2001/11/01