我正在尝试在访问时在表单中输入数据时发生事件,在文本框失去焦点后,如果该框不为空,我希望ID和值存储到另一个表中。尝试使用下面的代码后,我得到“运行时错误3061参数太少,预期1”。我已经检查了调试模式,并且值被转移并带到字符串。
Private Sub Consolidate_LostFocus()
Dim queryString As String
queryString = "INSERT INTO [ReportMasterTable]([#], [Notes]) VALUES(" & [#].Value & ", " & [Consolidate].Value & ")"
If Consolidate.Text <> vbNullString Then
CurrentDb.Execute (queryString)
End If
End Sub
答案 0 :(得分:3)
如果#
中的Notes
或ReportMasterTable
字段是文本数据类型,则必须在尝试INSERT
的值周围添加引号。
例如,如果两个字段都是文本类型:
queryString = "INSERT INTO [ReportMasterTable]([#], [Notes])" & vbCrLf & _
"VALUES ('" & [#].Value & "', '" & [Consolidate].Value & "')"
如果[#].Value
或[Consolidate].Value
包含单引号,情况会更复杂。您可以将插入值中的单引号加倍。但是,切换到参数化查询可能更容易......引用问题就会消失。
Dim db As DAO.database
Dim qdf As DAO.QueryDef
Dim strInsert As String
strInsert = "PARAMETERS hash_sign Text (255), note_value Text (255);" & vbCrLf & _
"INSERT INTO [ReportMasterTable]([#], [Notes])" & vbCrLf & _
"VALUES (hash_sign, note_value)"
Set db = CurrentDb
Set qdf = db.CreateQueryDef("", strInsert)
qdf.Parameters("hash_sign").value = Me.[#]
qdf.Parameters("note_value").value = Me.[consolidate]
qdf.Execute dbFailOnError
Set qdf = Nothing
Set db = Nothing
您还可以将SQL语句保存为命名查询,并在每次运行过程时打开并执行该语句,而不是重建语句。
答案 1 :(得分:1)
您是否有任何理由不希望将表单绑定到ReportMasterTable?
如果你真的有一个名为#的控制和字段,你将面临一个充满烦恼的世界。
如果您已将表单绑定到ReportMasterTable并且还在查询中进行更新,那么您将遇到问题。
丢失焦点事件是一个非常糟糕的事件要选择,任何时候任何人通过表单选中,代码都会运行。更新后会更好。
您正在更新文本数据类型,但尚未使用引号。
"INSERT INTO [ReportMasterTable]([#], [Notes]) VALUES(" & [#].Value _
& ", '" & [Consolidate].Value & "')"