从表单插入不同的表

时间:2013-01-25 20:21:39

标签: sql ms-access-2007 access-vba

我正在尝试在访问时在表单中输入数据时发生事件,在文本框失去焦点后,如果该框不为空,我希望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

2 个答案:

答案 0 :(得分:3)

如果#中的NotesReportMasterTable字段是文本数据类型,则必须在尝试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 & "')"