首页 > 解决方案 > 如何从 VBA ADODB 中的参数化 SQL Server 查询中诊断语法错误

问题描述

我正在使用 VBA adodbINSERT根据 Excel 行内容在 SQL Server 中编写语句。

我正在使用参数化查询,因此我的 VBA 代码具有以下形式:

sqlStatement = "INSERT INTO dbo.mytable (" & Join(insertElement(0), ", ") & ") VALUES (" & Join(insertElement(2), ", ") & ")"
Set cm = New ADODB.Command

With cm
      Debug.Print (sqlStatement)
            .ActiveConnection = conn
            .CommandText = sqlStatement
            .CommandType = adCmdText
             For Each e In insertElement(1)
                Set Pm = .CreateParameter(, adVarChar, 3, 1024, e)
                .Parameters.Append Pm
             Next e
             Set rs = .Execute
        End With

其中insertElement(0)是字段名称数组, ...(1) 是值数组, ...(2) 是?用于支持参数化的占位符数组

当我运行此代码时,出现错误

[Microsoft][ODBC Driver 13 for SQL Server][SQL Server]“输出”附近的语法不正确

但是,当我询问sqlStatement文本时,声明中的任何地方都没有“输出”。文本格式如下:

INSERT INTO dbo.mytable ([my_field_1],[my_field_2],[somefieldshaveweirdcharslike+#], ...) VALUES (?, ?, ?, ...) 

因此,如果我没有直接提供“输出”命令,并且由于它正在服务器端处理,我无法直接看到该语句,我该如何诊断语法?

标签: sql-serverexcelvbaadodb

解决方案


您应该能够通过迭代您的数组并以您认为合适的任何方式连接您的值来简单地构建您的 SQL 语句,而不是尝试将一堆参数插入一堆问号。像这样的东西(我假设它insertElement实际上是一个二维数组而不是一个集合;如果它真的是一个集合,那么你需要做类似的事情For Each):

sqlStatement = "INSERT INTO dbo.mytable (" & Join(insertElement(0), ", ") & ") VALUES ("
Set cm = New ADODB.Command

With cm
    .ActiveConnection = conn
    .CommandType = adCmdText
    Dim aCount As Integer
    aCount = Ubound(insertElement(1))
    For i = 0 To aCount - 1
        sqlStatement = sqlStatement & "'" & insertElement(1,i) & "'" & _
        Iif(i <> aCount - 1, ",", "")
    Next
    .CommandText = sqlStatement
    Set rs = .Execute
End With

综上所述,如果您想更深入地了解错误发生的位置,您可以尝试迭代Connection对象的Errors 集合Err由于尝试使用连接可能会产生多个错误,因此仅使用对象进行故障排除可能有点困难。

最后,最好INSERT在服务器端的存储过程中设置语句,并以这种方式将值作为参数传递,除非您没有理由担心注入攻击。


推荐阅读