执行动态sql字符串时出错

时间:2013-11-12 22:20:12

标签: sql vba ms-access access-vba

尝试在MS Access中执行动态sql字符串时遇到错误(我正在使用VBA编写代码)。

错误:

  

运行时错误'3075':   查询表达式“11/8/2013'FROM tbl_sample'中的语法错误(缺少运算符)。

这是我的代码:

Sub UpdateAsOfDate()

    Dim AsOfDate As String
    AsOfDate = Form_DateForm.txt_AsOfDate.Value
    AsOfDate = Format(CDate(AsOfDate))

    Dim dbs As Database

    Set dbs = OpenDatabase("C:\database.mdb")

            Dim strSQL As String
            strSQL = " UPDATE tbl_sample " _
                    & "SET tbl_sample.As_of_Date = '" _
                    & AsOfDate _
                    & "' " _
                    & "FROM tbl_sample " _
                    & "WHERE tbl_sample.As_of_Date IS NULL ;"


        dbs.Execute strSQL

    dbs.Close 
End Sub

我将strSQL传送到MsgBox,这样我就可以看到完成的SQL字符串,看起来它会毫无错误地运行。发生了什么事?

4 个答案:

答案 0 :(得分:3)

摆脱& "FROM tbl_sample " _。 from子句在更新语句中无效。

答案 1 :(得分:2)

#日期分隔符包含在 AsOfDate 字符串中。

AsOfDate = Format(Form_DateForm.txt_AsOfDate.value, "\#yyyy-m-d\#")

然后在构建UPDATE语句时使用预格式化的 AsOfDate 字符串。

strSQL = "UPDATE tbl_sample AS t" & vbCrLf & _
    "SET t.As_of_Date = " & AsOfDate & vbCrLf & _
    "WHERE t.As_of_Date IS NULL;"

另请注意,我放弃了FROM子句,因为它在Access UPDATE中无效,正如其他人所提到的那样。

或者您可以转换为参数查询,并避免处理日期分隔符。

答案 2 :(得分:2)

你真的应该使用参数化查询,因为

  • 他们更安全,
  • 您不必为日期和文本值弄乱分隔符,
  • 您不必担心在文本值中转义引号,
  • 他们正确处理日期,因此您的代码不会在设置为dd-mm-yyyy格式的计算机上破坏日期。

在你的情况下你会使用这样的东西:

Sub UpdateAsOfDate()
    Dim db As DAO.Database, qdf As DAO.QueryDef
    Dim AsOfDate As Date

    AsOfDate = DateSerial(1991, 1, 1)  ' test data

    Set db = OpenDatabase("C:\Users\Public\Database1.accdb")
    Set qdf = db.CreateQueryDef("", _
            "PARAMETERS paramAsOfDate DateTime; " & _
            "UPDATE tbl_sample SET As_of_Date = [paramAsOfDate] " & _
            "WHERE As_of_Date IS NULL")
    qdf!paramAsOfDate = AsOfDate
    qdf.Execute
    Set qdf = Nothing
    db.Close
    Set db = Nothing
End Sub

答案 3 :(得分:0)

尝试: -

    strSQL = " UPDATE t " _
            & "SET t.As_of_Date = '" _
            & AsOfDate _
            & "' " _
            & "FROM tbl_sample t " _
            & "WHERE t.As_of_Date IS NULL ;"

问题可能是您的Access驱动程序误解了您正在使用的别名(因为它与表名完全匹配)。