2017-10-09 17 views
0

シンプルなVBAコードを使用してアクセステーブルを更新しようとしていますが、エラーで終了しました。私はそれを解決するために様々な方法を試みましたが、成功しませんでした。 助けてくれますか?私も試してみましたDocmd.RunSql実行時エラー '3464' - 更新クエリ

strSQL = "UPDATE Projects " & _ 
      "SET Projects.id_status = '" & Me.T_project_s.Value & "' " & _ 
      "WHERE Projects.id_project = '" & Me.curr_open.Value & "';" 

:コードは以下の通りである

または

strSQL = "UPDATE [Projects] " & _ 
      "SET [Projects].[id_status] = '" & Me.T_project_s.Value & "' " & _ 
      "WHERE [Projects].[id_project] = '" & Me.curr_open.Value & "';" 

しかし、それは、これらの分野で利用可能なデータを要求します。

あなたの提案が助けになりました。私はテキストだけで始まり、それから私が読んでみたい特定の変数を変更しました。ですから、Whereステートメントでは、 ""のようにする必要はありません。

strSQL = "UPDATE [Projects] " & _ 
      "SET [Projects].[id_status] = '" & Me.T_project_s.Value & "' " & _ 
      "WHERE [Projects].[id_project] = " & Me.curr_open.Value & ";" 

ありがとうございます。

+0

[VBAでの動的SQLをデバッグする方法](のhttp:// stackoverflowの.com/questions/418960/manage-and-debugging-sql-queries-in-ms-access/1099570#1099570) – Andre

+0

変数を実際の値に置き換えるとSQLが機能しますか?例: 'strSQL =" UPDATEプロジェクトSET Projects.id_status = ' さらに、あなたのフィールド名は、sqlが文字列を引用符で囲んでいる間に、あなたがIDのもの(しばしば数字)を使用していることを意味します。 – Calaris

+0

あなたの質問は解決しましたか?はいの場合は、回答を投稿するか、質問を終了してください。 – Andre

答えて

1

ここでもまた、パラメータ化(SQLプログラミングの業界でのベストプラクティス)がSQLインジェクションを回避するのに役立つ例です。 querydef parametersの場合:

  1. あなたは引用封筒の必要を避けます。
  2. 変数の文字列補間を避ける。
  3. クリーンスクリプト用のコード(すなわち、SQL文)からの抽象データ(すなわち、VBA変数)。
  4. (また、OPが混合型であると分かっています)は、バインドする値のデータ型を明示的に定義します。
  5. ユーザーに警告を発するDoCmd.RunSQLよりもスムーズなユーザーインターフェイスのためにDAO経由でクエリを実行します。

一時クエリ

Dim qdef As QueryDef 

' PREPARED STATEMENT, DEFINING PLACEHOLDERS (NO DATA) 
strSQL = "PARAMETERS [project_s_param] Text(255), [curr_open_param] Long;" & _ 
     " UPDATE [Projects]" & _ 
     " SET [Projects].[id_status] = [project_s_param]" & _ 
     " WHERE [Projects].[id_project] = [curr_open_param];" 

' CREATE UNNAMED TEMP QUERYDEF, ASSIGNING PREPARED STATEMENT 
Set qdef = CurrentDb.CreateQueryDef("", strSQL) 

' BIND VBA VALUES TO PARAMETER PLACEHOLDERS 
qdef![project_s_param] = Me.T_project_s.Value 
qdef![curr_open_param] = Me.curr_open.Value 

' EXECUTE ACTION 
qdef.Execute dbFailOnError 

Set qdef = Nothing 

保存されたクエリ

さらに良いことに、保存されたAccessクエリとして全体のプリペアドステートメントを保存し、VBAで任意のSQLを避けます。

SQL (名前はVBAで参照されている任意の正規クエリオブジェクトとして保存)

PARAMETERS [project_s_param] Text(255), [curr_open_param] Long; 
UPDATE [Projects] 
SET [Projects].[id_status] = [project_s_param] 
WHERE [Projects].[id_project] = [curr_open_param] 

VBA

Dim qdef As QueryDef 

' REFERENCE EXISTING QUERYDEF, ASSIGNING PREPARED STATEMENT 
Set qdef = CurrentDb.QueryDefs("mySavedQuery") 

' BIND VBA VALUES TO PARAMETER PLACEHOLDERS 
qdef![project_s_param] = Me.T_project_s.Value 
qdef![curr_open_param] = Me.curr_open.Value 

' EXECUTE ACTION 
qdef.Execute dbFailOnError 

Set qdef = Nothing 
関連する問題