DAO:フィールド名 No に対して抽出が正しく行われない Hit Counter

対象バージョン : 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つが考えられます。

  1. No を別の名前に変更する。
  2. [No] のように、中括弧を付けて、フィールド名であることを明示する。
  3. Table1.No のように、テーブル名を修飾する。

"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 データベース エンジンの予約語 」を参照してください。

 

改定履歴


目次へ戻る