Microsoft Access 掲示板

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

6 コメント
views
4
beginner 2025/04/15 (火) 08:57:51 61dd6@e1025

hirotonさん skさん 詳細な回答ありがとうございました。なりほどそういう事だったのですね。
因みに前回質問分でhirotonさんとhatenaさんから回答頂いた下記はCurrentDb.Execute strSQLでいけたのですが、これは何故でしょうか? 更新と追加の違いはありますが(完全に理解出来てなくすみません)

Dim strSQL As String
If Not IsNull(Me!change_Date) Then strSQL = ", [完成日付]=" &  Format(Me!change_Date, "#yyyy/mm/dd#")
If IsDate(Me!change_Kokyaku) Then strSQL = strSQL & ", [顧客ID]=" & Me!change_Kokyaku
If Not IsNull(Me!change_Firm) Then strSQL = strSQL & ", [firmID]=" & Me!change_Firm
If Not IsNull(Me!change_Tanto) Then strSQL = strSQL & ", [製造担当者ID]=" & Me!change_Tanto
If Not IsNull(Me!change_Biko) Then strSQL = strSQL & ", [備考]='" & Me!change_Biko & "'"

If strSQL = "" Then Exit Sub

strSQL = "UPDATE [T_製造履歴] SET " & Mid(strSQL, 3) & " WHERE [check]=True;"

通報 ...
  • 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 文が実際に
    どのようになっているかを確認してみることをお奨めします。