【问题标题】:Access VBA using SQL UPDATE使用 SQL UPDATE 访问 VBA
【发布时间】:2019-02-23 17:26:36
【问题描述】:

我正在使用两个 Access 数据库(前端和后端)。

我的查询代码工作,但我得到它来更新数据库。我做错了什么?

我在第 25 行收到 DoCmd.RunSQL strSql 的运行时错误 3078。

Set cnn = CreateObject("ADODB.Connection")
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
    "Data Source=" & CurrentProject.Path & "\DB_Cryk.accdb"

cnn.Open strConnection

MemberID = txtMemberID.Value

strSql = "UPDATE Cryk " & _
"SET Membership = '" & txtMembership.Value & "', " & _
"    Memberstatus = '" & txtMemberstatus.Value & "', " & _
"    Membername = '" & txtMembername.Value & "', " & _
"    Memberaddress = '" & txtMemberaddress.Value & "', " & _
"    Memberzip = '" & txtMemberzip.Value & "', " & _
"    Membercity = '" & txtMembercity.Value & "', " & _
"    Memberphone = '" & txtMemberphone.Value & "', " & _
"    Membermail = '" & txtMembermail.Value & "', " & _
"    Memberyear = '" & txtMemberyear.Value & "', " & _
"    Dateofbirth = '" & txtDateofbirth.Value & "', " & _
"    Memberno = '" & txtMemberno.Value & "', " & _
"    Memberfee = '" & txtMemberfee.Value & "', " & _
"    Memberpayment = '" & txtMemberpayment.Value & "'" & _
"WHERE MemberID= '" & MemberID & "'"

DoCmd.RunSQL strSql

cnn.Close
Set cnn = Nothing

【问题讨论】:

  • 您假设所有字段都是文本数据类型,但实际上可能不是。此外,请考虑使用 参数 来完全避免该问题。
  • 我会打印出结果 strSql 字符串,看看它是否是有效的 SQL。我赞同古斯塔夫的观点,使用参数。 SQL 查询的字符串连接为您打开了 SQL 注入的大门。下面是一个在 VBA 中使用参数的例子:stackoverflow.com/a/50102644/2675670
  • 谢谢,在过去的 15 年里我对 sql 的经验很少,所以你能帮忙举一个基于我的代码使用参数的例子吗?

标签: vba ms-access


【解决方案1】:

错误 3078 表示目标表在您的数据库中不存在。

请注意,尽管您打开了与数据库 DB_Cryk.accdb 的 ADO 连接,但您使用 DoCmd.RunSQL 方法执行 SQL 语句,该方法在当前数据库上运行。

相反,如果您希望 SQL 在您的 DB_Cryk.accdb 数据库中执行,您应该使用 ADODB Connection 对象的 Execute 方法,例如:

cnn.Execute strsql

关于查询参数化,您可能希望参考this superb answer,特别是“使用 ADO”部分。

【讨论】:

  • 谢谢 Lee :),现在我只需要解决数据类型问题
  • @KimK 我已经更新了我的答案,以提供有关在 ADO 中使用参数的更多信息。
猜你喜欢
  • 2022-01-01
  • 2018-12-22
  • 1970-01-01
  • 2015-07-26
  • 2018-03-25
  • 2015-04-07
  • 2018-07-11
  • 2021-09-10
  • 1970-01-01
相关资源
最近更新 更多