【问题标题】:VBA ADODB SQL query returns "Automation error" when reading a variable from cell, works well when a value is assigned in VBA code从单元格读取变量时,VBA ADODB SQL 查询返回“自动化错误”,当在 VBA 代码中分配值时效果很好
【发布时间】:2020-10-26 20:56:03
【问题描述】:

调试器在运行以下命令时返回自动化错误:

Private Sub setDB()

Dim SQL As String
Dim Var As String

Dim conn As ADODB.Connection
Set conn = New ADODB.Connection

conn.Open "DRIVER={MariaDB ODBC 3.0 Driver}" _
& ";SERVER=" & "localhost" _
& ";DATABASE=" & "pbx" _
& ";USER=" & "root" _
& ";PASSWORD=" & "r00t" _

Var = Worksheets(3).Range("B2").Value  

SQL = "UPDATE ps_product SET ean13='" & Var & "' WHERE id_product=12"
conn.Execute (SQL)

但是,当我像这样为 Var 赋值时:Var=10,代码运行良好。我在这里错过了什么吗?我在互联网上搜索了几天,但没有找到类似的东西。请问some1 可以提供帮助吗?或者可以发送一个类似问题的链接吗?

【问题讨论】:

  • Debug.Print Worksheets(3).Range("B2").Value 返回什么?
  • 好奇,在你多日的搜索中,有没有碰到一个叫做 SQL 参数化的概念?
  • 嗨 Parfait,不,我第一次看到这个概念。所以我研究了一下,发现了一些有用的信息在这里 [link]stackoverflow.com/questions/10352211/… 和在这里的“使用连接对象”部分:[link]docs.microsoft.com/en-us/sql/ado/guide/data/…。使用连接对象或命令对象的行为似乎相同。
  • 毕竟没关系让它工作。感谢参数化的提示。

标签: sql vba sql-update mariadb adodb


【解决方案1】:

考虑参数化,将应用层值绑定到执行的 SQL 查询的首选方法。 ADO 通过Command parameters 支持这种方法。如果字符串值包含单引号等特殊字符,这可以避免混乱的连接、引号标点和转义需求。

Dim Sql As String, Var As String

Dim conn As ADODB.Connection
Dim cmd As ADODB.Command              ' NEW OBJECT TO INITIALIZE

Set conn = New ADODB.Connection

conn.Open "DRIVER={MariaDB ODBC 3.0 Driver}" _
           & ";SERVER=" & "localhost" _
           & ";DATABASE=" & "pbx" _
           & ";USER=" & "root" _ 
           & ";PASSWORD=" & "r00t" _

' PREPARED STATEMENT WITH PLACEHOLDER (NO QUOTES OR CONCATENATION)
Sql = "UPDATE ps_product SET ean13=? WHERE id_product=12"  

' CONVERT TO NEEDED TYPE 
Var = CStr(Worksheets(3).Range("B2").Value)

Set cmd = New ADODB.Command

With cmd
    .ActiveConnection = conn
    .CommandText = Sql
    .CommandType = adCmdText

    ' BIND PARAMS AND DEFINE TYPE AND LENGTH
    .Parameters.Append .CreateParameter("prm", adVarChar, adParamInput, 255, Var)

    ' EXECUTE ACTION
    .Execute
End cmd

【讨论】:

    【解决方案2】:

    当所需的单元格作为参数传递时,查询正在工作。 (感谢@Parfait 的提示) 可以在这里找到一些帮助我解决这个问题的有用信息:

    VBA, ADO.Connection and query parameters https://docs.microsoft.com/en-us/sql/ado/guide/data/creating-and-executing-a-simple-command?view=sql-server-ver15 https://docs.microsoft.com/en-us/sql/ado/guide/data/passing-parameters-to-a-named-command?view=sql-server-ver15

    Working example:
    
    Private Sub setDB()
    
    Dim Cm As New ADODB.Command
    Dim Rs As New ADODB.Recordset
    
    Dim conn As ADODB.Connection
    Set conn = New ADODB.Connection
    
    Test = Worksheets(3).Range("B2").Value
    
    CommandText = "UPDATE ps_product SET ean13=? WHERE id_product=12;"
    
    conn.Open "DRIVER={MariaDB ODBC 3.0 Driver}" _
    & ";SERVER=" & "localhost" _
    & ";DATABASE=" & "pbx" _
    & ";USER=" & "root" _
    & ";PASSWORD=" & "r00t" _
    
    Cm.CommandText = CommandText
    Cm.CommandType = adCmdText
    Cm.Name = "Var"
    Set Cm.ActiveConnection = conn
    
    conn.Var Test, Rs
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2013-07-09
      • 2020-12-20
      • 1970-01-01
      • 2014-05-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-25
      • 1970-01-01
      • 2015-10-23
      相关资源
      最近更新 更多