DAO:フィールド名 No に対して抽出が正しく行われない |
対象バージョン : 97, 2000(MDB), 2002(MDB), 2003(MDB), 2007(ACCDB)
最終更新日 : 2007/02/25
(オリジナル作成日 : 2001/08/05)
概 要
名前が No (no や NO) のフィールドに対して SQL を用いて抽出条件を設定し、Recordset オブジェクトを作成しても、希望する結果が得られない。
再現手順
1.次のフィールドを持つテーブル Table1 を作成します。
フィールド名 |
データ型 |
No | 数値型 |
フィールドサイズ:長整数型
2.Table1 にデータ入力
フィールド No に 1 を入力したレコードを1件保存します。
3.プロシージャの作成及び実行
Public Sub Sample() Dim db As Database Dim rs As Recordset Dim strSQL As String strSQL = "SELECT COUNT(*) AS 件数 FROM Table1 WHERE No = 1" Set db = CurrentDb Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot) MsgBox "件数 = " & rs!件数 rs.Close db.Close Set rs = Nothing Set db = Nothing End Sub
このプロシージャを実行すると、MsgBox ステートメントで "件数 = 1" と表示されることが予想されますが、結果は "件数 = 0" となります。
解 説
SQL 中の抽出条件でフィールド名として指定している No
がフィールド名ではなく、Yes/No(True/False)
のキーワード No として評価されています。
このため、SQL は次と同じ意味になります。
strSQL = "SELECT COUNT(*) AS 件数 FROM Table1 WHERE 0 = 1"
これを回避する方法としては、次の3つが考えられます。
"No" は Access
の予約語として定義されていますので、改名されることが望ましいでしょう。
Access
の予約語については、下記参考リンクをご参照ください。
なお、クエリーでは、自動的に Table1.[No] と設定されるため、フィールド名として評価されるようになっています。
参考リンク
●『ACC: Reserved Words in Microsoft Access』
http://support.microsoft.com/support/kb/articles/q109/3/12.asp
●『ACC2000: Reserved Words in Microsoft Access』
http://support.microsoft.com/support/kb/articles/Q209/1/87.ASP
●『ACC2002: Reserved Words in Microsoft Access』
http://support.microsoft.com/support/kb/articles/Q286/3/35.ASP
●Ver.2003 では、ヘルプで "SQL 予約語" を参照してください。
●Ver.2007 では、ヘルプで "予約語" を検索し、「Access 2007 の予約語と記号」の中から「Access データベース エンジンの予約語 」を参照してください。
改定履歴