VBA SQL缺少WHERE子句的最后一个条件

VBA SQL缺少WHERE子句的最后一个条件,sql,vba,ado,Sql,Vba,Ado,为了得到一条在VBA中运行的相当简单的SQL语句,我把我遗漏的最后一根头发拔了出来。当语句的字符串编译时,它切断了WHERE子句的最后一个条件,我不知道如何修复它。请帮忙 我的SQL字符串如下所示: sSQL = "UPDATE Allocations SET WithdrawalDate =" & dThisWithdrawDate & ",Notes = '" & sNotes & "' WHERE StaffID =" & lID & " A

为了得到一条在VBA中运行的相当简单的SQL语句,我把我遗漏的最后一根头发拔了出来。当语句的字符串编译时,它切断了WHERE子句的最后一个条件,我不知道如何修复它。请帮忙

我的SQL字符串如下所示:

sSQL = "UPDATE Allocations SET WithdrawalDate =" & dThisWithdrawDate & ",Notes = '" & sNotes & "' WHERE StaffID =" & lID & " AND PatientID = " & lThisPatientID & ";"

字符串与StaffID变量一起编译,并切断子句的and部分。我做错了什么?

试着以某种可复制的方式来做:

Public Sub TestMe()

    Dim sSql As String
    Dim dThisWithdrawDate As String: dThisWithdrawDate = "foo"
    Dim sNotes As String: sNotes = "bar"
    Dim lID As Long: lID = 5
    Dim lThisPatientID As Long: lThisPatientID = 10

    sSql = "UPDATE Allocations SET WithdrawalDate =" & dThisWithdrawDate & ",Notes = '" & sNotes & "' WHERE StaffID =" & lID & " AND PatientID = " & lThisPatientID & ";"
    Debug.Print sSql

End Sub
上面的代码打印:

UPDATE Allocations SET WithdrawalDate =foo,Notes = 'bar' WHERE StaffID =5 AND PatientID = 10;

因此,AND子句与其他地方断开。

尝试以某种可复制的方式执行此操作:

Public Sub TestMe()

    Dim sSql As String
    Dim dThisWithdrawDate As String: dThisWithdrawDate = "foo"
    Dim sNotes As String: sNotes = "bar"
    Dim lID As Long: lID = 5
    Dim lThisPatientID As Long: lThisPatientID = 10

    sSql = "UPDATE Allocations SET WithdrawalDate =" & dThisWithdrawDate & ",Notes = '" & sNotes & "' WHERE StaffID =" & lID & " AND PatientID = " & lThisPatientID & ";"
    Debug.Print sSql

End Sub
上面的代码打印:

UPDATE Allocations SET WithdrawalDate =foo,Notes = 'bar' WHERE StaffID =5 AND PatientID = 10;

因此,AND子句与其他地方断开。

另一种方法,正如@Kostas建议的那样,是使用参数:

子测试()
Dim数据此日期为日期
暗鼻孔如细绳
暗淡的盖子
昏黄的脸和我的脸一样长
DthisDate=DateSerial(2018年6月10日)
sNotes=“在字符串concat中,如果没有麻烦,就不可能有此注释。”
lID=1
lthipatientid=2
使用CurrentDb.CreateQueryDef(“”_
“参数日期时间,患者注释文本(255),”和_
“StaffIdentifier Long,PatientIdentifier Long;”_
“更新分配设置取款日期=取款日期,备注=患者备注”&_
“其中StaffID=StaffIdentifier,PatientID=PatientIdentifier”)
.参数(“提取日期”)=数据此提取日期
.Parameters(“PatientNotes”)=sNotes
.参数(“StaffIdentifier”)=lID
.Parameters(“PatientIdentifier”)=lthipatientid
.执行
以
端接头

或者,如果使用存储查询,您也可以使用类似于:
和db.querydfs(“DML\u Update\u AllocationTable”)
的内容。

另一种方法是@Kostas建议使用参数:

子测试()
Dim数据此日期为日期
暗鼻孔如细绳
暗淡的盖子
昏黄的脸和我的脸一样长
DthisDate=DateSerial(2018年6月10日)
sNotes=“在字符串concat中,如果没有麻烦,就不可能有此注释。”
lID=1
lthipatientid=2
使用CurrentDb.CreateQueryDef(“”_
“参数日期时间,患者注释文本(255),”和_
“StaffIdentifier Long,PatientIdentifier Long;”_
“更新分配设置取款日期=取款日期,备注=患者备注”&_
“其中StaffID=StaffIdentifier,PatientID=PatientIdentifier”)
.参数(“提取日期”)=数据此提取日期
.Parameters(“PatientNotes”)=sNotes
.参数(“StaffIdentifier”)=lID
.Parameters(“PatientIdentifier”)=lthipatientid
.执行
以
端接头

或者,如果使用存储查询,则可以使用类似以下内容:
和db.querydfs(“DML\u Update\u AllocationTable”)

您需要养成使用参数的习惯。SQL连接是危险的。一旦我让它工作起来,我可能会尝试使用参数重构它。这是非常有限的(本地)使用,所以风险相当低。感谢您的建议:)因为您使用的是字符串连接,所以您的sNotes字符串中可能有什么东西(撇号,或者回车?)以某种方式提前终止SQL语句。如果要诊断问题,请向我们显示sSQL的确切值,或者使用适当的参数重试,看看问题是否消失。记住,这不仅仅是安全问题。例如,如果你的笔记中有“不”这个词(撇号是一个单引号字符),你的陈述将不起作用,因为
将关闭
notes=…”
Matt的开放引号,我想你已经为我解决了这个问题。我的笔记串里有一个撇号。我提供了一个没有标点符号的notes字符串,它按照我的需要解析了SQL语句,谢谢@达伦·巴特鲁普·库克:)这是一部老掉牙的,但是非常好的节目。你需要养成使用参数的习惯。SQL连接是危险的。一旦我让它工作起来,我可能会尝试使用参数重构它。这是非常有限的(本地)使用,所以风险相当低。感谢您的建议:)因为您使用的是字符串连接,所以您的sNotes字符串中可能有什么东西(撇号,或者回车?)以某种方式提前终止SQL语句。如果要诊断问题,请向我们显示sSQL的确切值,或者使用适当的参数重试,看看问题是否消失。记住,这不仅仅是安全问题。例如,如果你的笔记中有“不”这个词(撇号是一个单引号字符),你的陈述将不起作用,因为
将关闭
notes=…”
Matt的开放引号,我想你已经为我解决了这个问题。我的笔记串里有一个撇号。我提供了一个没有标点符号的notes字符串,它按照我的需要解析了SQL语句,谢谢@达伦·巴特鲁普·库克:)一部老歌,但却是一部非常好的演出。谢谢维蒂亚塔。这很奇怪,因为我在字符串sSQL上添加了一个break和一个watch,这是一个如上所述的简单赋值,赋值后的字符串值是:“UPDATE[Allocations]设置取款日期为2018年6月22日,注释为“某些文本”,其中StaffID=10-缺少哪个文本PatientID@MrCholmondleyWarner这是有效的SQL吗?在大多数数据库上,我希望日期值需要引号。我还没有弄清楚,Matt,它可能是无效的。我只是连接了一个日期变量以将其添加到字符串中,所以它就是er VBA生成。听起来我需要用引号将其括起来……我现在知道它为什么不运行了:DThanks Vityata。这非常奇怪,因为我在字符串sSQL上添加了一个中断和一个手表,这是一个如上所述的简单赋值,赋值后字符串值立即为:“UPDATE[Allocations]SET dracumaldate=22/06/2018,注释='some text',其中StaffID=1