从表单插入到不同的表中

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

以上是关于从表单插入到不同的表中的主要内容,如果未能解决你的问题,请参考以下文章

如何从 3 个不同的表中插入内连接

如何使用触发器从两个不同的表中插入数据

我想将两个不同的表行值插入到单个表中,

从同一个包更新和插入到 2 个不同的表

在jetstream更新表单中更新用户配置文件时,将用户的不同类型数据保存在不同的表中

使用 Linq 将数据插入到两个不同的表中