Microsoft Access 掲示板

CurrentDb.Execute strSQLでは何故かエラー / 5

6 コメント
views
5

前回質問分でhirotonさんとhatenaさんから回答頂いた下記は
CurrentDb.Execute strSQLでいけたのですが、これは何故でしょうか?

変数 strSQL に格納された SQL 文の中に「パラメータと解釈し得る要素」が含まれておらず、
また SQL 全体において構文上の不備がないからです。

この場合の「パラメータと解釈し得る要素」とは、主に次のようなものです。

  • データベース上のどのテーブル/クエリの名前とも一致しない識別子

  • クエリから呼び出されたテーブル/クエリのどのフィールドの名前とも一致しない識別子

件の INSERT INTO 文 においては、Forms![F_改修履歴に追加設定]![tx受付日付代入用]などの記述は
FROM 句で呼び出されている[T_製造履歴]のどのフィールドの名前とも一致しないため、
暗黙的に「そういう名前のパラメータである」と解釈されます。

strSQL = ", [完成日付]=" &  Format(Me!change_Date, "#yyyy/mm/dd#")

上記の場合は非連結テキストボックス[change_Date]の値が
「 SQL 内における日時リテラル」として組み込まれるよう
文字列の整形と文字列連結が行われており、最終的に
UPDATE 文の中に「パラメータと解釈し得る要素」が
含まれないようになっています。

strSQL & ", [備考]='" & Me!change_Biko & "'"

ちなみに、この時の非連結テキストボックス[change_Biko]の値が
「I'm sorry.」という文字列だった場合、SQL 上の構文エラーが発生します。

文字列リテラルの囲み記号としてシングルクォーテーションを使用する場合は、
文字としてのシングルクォーテーションを次のようにエスケープした方がよいでしょう。


If Not IsNull(Me!change_Biko) Then strSQL = strSQL & ", [備考]='" & Replace(Me!change_Biko, "'", "''", 1, -1, vbBinaryCompare) & "'"

SQL 文のチェック作業を行なう際には、

'イミディエイトウィンドウに変数 strSQL の値( SQL 文)を出力
Debug.Print strSQL
'変数 strSQL に格納された SQL 文を実行
CurrentDb.Execute strSQL

以上のようにしておき、生成された SQL 文が実際に
どのようになっているかを確認してみることをお奨めします。

通報 ...