sql - 运行时“3129”更新语句
问题描述
我正在用 VBA/MS Access 编写代码,但遇到了这个错误。我想是日期。我使用的功能:
DOB = Format(DOB,"\#mm\/dd\/yyyy\#")
现在这适用于也在我的代码中运行的 INSERT sql。当我 Debug.Print 时看起来像这样
,#01/01/1900#,
我的问题是我的 UPDATE sql 语句。
"UPDATE table SET " & "DOB=" & DOB & "," & "Last_Maintain_Date=" & LastMaintainDate & _
"," & LastmaintainUser & " WHERE ID=" & ID
调试.打印
UPDATE table SET DOB=#03/01/1983#,Last_Maintain_Date="10/11/2019 2:59:47 PM",Last_Maintain_User="User Name" WHERE ID=11111111
DOB 是一个日期字段。ID 是一个数字字段,另外两个是字符串。我希望运行时错误对您的帮助不仅仅是“您的代码错误”。
解决方案
考虑使用QueryDefs在 MS Access 中支持的参数化,并有助于避免使用标点符号或连接:
Dim strSQL As String
Dim qdef As QueryDef
' PREPARED SQL STATEMENT WITH PARAMETERS CLAUSE (NO DATA)
strSQL = "PARAMETERS [prmDOB] Date, [prmLastMaintainDate] Date, "_
& " [prmLastmaintainUser] Text, [prmID] Long;"
& " UPDATE mytable " _
& " SET DOB = [prmDOB], " _
& " Last_Maintain_Date = [prmLastMaintainDate], " _
& " LastmaintainUser = [prmLastmaintainUser] " _
& " WHERE ID = [prmID]"
Set qdef = CurrentDb.QueryDefs("", strSQL)
' BIND PARAMS (NO QUOTES OR HASHTAGS)
qdef![prmDOB] = DOB ' ASSUMED TO BE A DATE TYPE
qdef![prmLastMaintainDate] = LastMaintainDate ' ASSUMED TO BE A DATE TYPE
qdef![prmLastmaintainUser] = LastmaintainUser ' ASSUMED TO BE A STRING TYPE
qdef![prmID] = ID ' ASSUMED TO BE AN INT/LONG TYPE
' RUN ACTION
qdef.Execute dbFailOnError
Set qdef = Nothing
您甚至可以将上面的更新语句保存为 MS Access 存储查询并在下面引用它,完全将 SQL 从 VBA 中分离出来:
Set qdef = CurrentDb.QueryDefs("mySavedUpdateQuery")
' BIND PARAMS
qdef![prmDOB] = DOB
qdef![prmLastMaintainDate] = LastMaintainDate
qdef![prmLastmaintainUser] = LastmaintainUser
qdef![prmID] = ID
' RUN ACTION
qdef.Execute dbFailOnError
Set qdef = Nothing
请注意,SQL 参数化是编程行业的最佳实践,它超越了 VBA 扩展到任何将 SQL 作为低级语言运行的应用程序层,包括 Java、Python、C#、PHP 等通用语言。尽管实现不同,但将 SQL 与应用程序代码分开的概念是相同的。请参阅 StackOverflow 联合创始人 Jeff Atwood 的给我参数化 SQL,或者给我死亡。
推荐阅读
- cuda - 链接通过clang编译.cu文件生成的.ll文件
- scheme - Let-Form 在 Scheme 中绑定值
- c++ - 为什么这显示为错误,它应该是什么?
- javascript - 如何在现有资源的基础上,准备带有路由的 Vue 组件化项目?
- typescript - 键入自定义操作类型
- javascript - 如何使用 p5.js 在画布上绘制图块
- python - 我无法在 Hadoop 集群中执行 mapreduce 作业
- python - 如何分别打印出函数的参数?
- r - 如何使用多个 Stargazer 表创建单个 pdf
- regex - 仅当一组字符串中的一个匹配时,如何才能返回 true?