从表单插入到不同的表中
Posted
技术标签:
【中文标题】从表单插入到不同的表中【英文标题】:Inserting into a different table from a form 【发布时间】:2013-01-25 20:21:38 【问题描述】:我试图在访问表单中输入数据时创建一个事件,在文本框失去焦点后,如果框不为空,我希望将 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
【问题讨论】:
这只是一个小型内部数据库,我们只使用它几个星期进行一些分析 如果您使用了参数化查询,那么您甚至不会问这个问题,因为不会有这个分隔符问题。做对就是做对。 访问参数查询的创建和使用相当简单。我给你的例子可能会像写的那样运行而不会出错。试试看;不喜欢就丢弃。 参数查询可能是一个想法,但这里还有更多的问题。这种形式可能根本不应该包含 SQL,它应该绑定到一个表或查询。在这种情况下,参数是掩盖实际设计问题的红鲱鱼。它是指一个断腿的人被割伤的手指。这就是为什么@Hogan,我没有提到参数。 @Remou - 我想我们需要同意不同意;一定程度的间接(即数据绑定)不会对设计产生太大影响,但不使用参数化查询或存储过程对可维护性、稳定性和安全性有很大影响。 【参考方案1】:如果ReportMasterTable
中的#
或Notes
字段是文本数据类型,则必须在尝试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 语句保存为命名查询并打开并执行它,而不是每次运行过程时都重新构建语句。
【讨论】:
【参考方案2】:您有什么理由不希望将表单绑定到 ReportMasterTable?
如果你真的有一个名为 # 的控件和字段,那么你将面临一个麻烦的世界。
如果您已将表单绑定到 ReportMasterTable 并且还在查询中进行更新,那么您将会遇到问题。
失去焦点事件是一个非常糟糕的事件选择,任何时候任何人通过表单选项卡,代码都会运行。更新后会更好。
您正在更新文本数据类型,但尚未使用引号。
"INSERT INTO [ReportMasterTable]([#], [Notes]) VALUES(" & [#].Value _
& ", '" & [Consolidate].Value & "')"
【讨论】:
名字不是我写的,是同事写的。我必须使用我拥有的东西 我不是在责怪你,但这些特定的名称是分隔符,所以我强烈建议你尽快更改它们,即使你现在只是使用查询和别名。 谢谢你,我打算改变它们。这就是当你的 PM 设计你的数据库时会发生的事情 lol以上是关于从表单插入到不同的表中的主要内容,如果未能解决你的问题,请参考以下文章