2

我试图在访问表单中输入数据时创建一个事件,在文本框失去焦点之后,如果框不为空,我希望将 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
4

2 回答 2

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 语句保存为命名查询并打开并执行它,而不是每次运行过程时都重新构建语句。

于 2013-01-25T20:33:17.113 回答
1

您是否有任何理由不希望将表单绑定到 ReportMasterTable?

如果您真的有一个名为# 的控件和字段,那么您将面临一个麻烦的世界。

如果您已将表单绑定到 ReportMasterTable 并且还在查询中进行更新,那么您将遇到问题。

失去焦点事件是一个非常糟糕的事件选择,任何时候任何人通过表单选项卡,代码都会运行。更新后会更好。

You are updating a text data type, but you have not used quotes.

"INSERT INTO [ReportMasterTable]([#], [Notes]) VALUES(" & [#].Value _
    & ", '" &   [Consolidate].Value & "')"
于 2013-01-25T20:34:05.303 回答