756323_12394535

 たまにはMicrosoft Access(以下、Access)の技術的なネタでも書いてみようと思います。

 今回はAccessとADO(ActiveX Data Objects)で使うワイルドカードが異なることで大はまりした内容です。その詳細は下記を。

ワイルドカードとは

 まず、ワイルドカードというのは何かというと、検索などで名前を指定するときに「任意の文字」を指定するときに使う文字(記号)をワイルドカードといいます。

 例えばAccessのクエリでUserテーブルのname(名前)フィールドに「村」の文字が先頭に含まれているデータを探す場合はクエリのデザインで下記のような設定を行います。

「村」が先頭に含まれるUserを探すクエリ

「村」が先頭に含まれる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データベースプログラミング)

著者/訳者:ウィリアム・R. ボーン

出版社:翔泳社( 2001-11 )

定価:

単行本 ( 371 ページ )

ISBN-10 : 479810129X

ISBN-13 : 9784798101293