1

尝试在 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

4 回答 4

3

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

于 2013-11-12T22:24:11.300 回答
2

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

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

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

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

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

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

于 2013-11-12T22:32:37.427 回答
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
于 2013-11-12T22:52:40.553 回答
0

尝试:-

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

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

于 2013-11-12T22:32:29.707 回答