【问题标题】:Use value in Excel cell as condition for WHERE clause in SQL query使用 Excel 单元格中的值作为 SQL 查询中 WHERE 子句的条件
【发布时间】:2020-06-23 12:50:57
【问题描述】:
Sub Get_Data()

Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim dateVar As Date

    Set conn = New ADODB.Connection
    conn.ConnectionString = "DRIVER={MySQL ODBC 5.1 Driver}; SERVER=localhost; DATABASE=bi; UID=username; PWD=password; OPTION=3"
    conn.Open

                strSQL = " SELECT " & _
                            " Products " & _
                            " FROM Logistics " & _
                            " WHERE DATE(insert_timestamp) = ""2020-02-24"" " & _
                            " GROUP BY 1"

    Set rs = New ADODB.Recordset
    rs.Open strSQL, conn, adOpenStatic

    Sheet5.Range("A1").CopyFromRecordset rs

    rs.Close
    conn.Close

End Sub

我运行上述VBA 以从database 中提取值。
它完全符合我的需要。


现在,我不想在strSQL 中使用预定义的日期,而是想使用在我的 Excel 电子表格中输入到 Cell B1 的数据。因此,我将VBA中的strSQL部分改为:

        strSQL = " SELECT " & _
                    " Products " & _
                    " FROM Logistics " & _
                    " WHERE DATE(insert_timestamp) = " & Sheet1.Range("B1") & " " & _
                    " GROUP BY 1"

但是,现在我在rs.Open strSQL, conn, adOpenStatic 上收到了runtime error -2147217887 (80040e21)

我需要更改我的VBA 中的哪些内容才能使其正常工作?

【问题讨论】:

    标签: mysql sql excel vba


    【解决方案1】:

    考虑使用ADO Command 对象的SQL parameterization 行业最佳实践,该对象可以正确处理数据类型而无需字符串连接或各种格式:

    Dim conn As ADODB.Connection      ' REMOVE New INITIALIZATION IN Dim LINES
    Dim rs As ADODB.Recordset
    Dim cmd As ADODB.Command
    Dim dateVar As Date
    
    Set conn = New ADODB.Connection
    conn.ConnectionString = "DRIVER={MySQL ODBC 5.1 Driver}; ..."
    conn.Open
    
    ' STRING STATEMENT WITH QMARK PLACEHOLDER
    strSQL = " SELECT " & _
                 "   Products " & _
                 " FROM Logistics " & _
                 " WHERE DATE(insert_timestamp) = ?" & _
                 " GROUP BY Products"
    
    ' CONVERT CELL TO DATE TYPE (IF CELL FORMATTED AS STRING)
    dateVar = CDate(Sheet1.Range("B1").Value)
    
    Set cmd = New ADODB.Command
    
    With cmd
       .ActiveConnection = conn
       .CommandText = strSQL
       .CommandType = adCmdText
    
       ' BIND PARAMS TO QMARK POSITIONAL PLACEHOLDER
       .Parameters.Append .CreateParameter("mydate", adDate, adParamInput, , dateVar)
    
       ' PASS RESULT TO RECORDSET
       Set rs = .Execute
    End With
    
    Sheet5.Range("A1").CopyFromRecordset rs
    

    【讨论】:

      【解决方案2】:

      试试:

      strSQL =    " SELECT " & _
                  " Products " & _
                  " FROM Logistics " & _
                  " WHERE DATE(insert_timestamp) = '" & Format(Sheet1.Range("B1").Value, "YYYY-MM-DD") & "' " & _
                  " GROUP BY 1"
      

      请注意,如果 insert_timestamp 确实包含除午夜之外的 时间,如果不转换为日期,您可能无法获得想要的结果或更改您的 SQL。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-30
      • 1970-01-01
      • 1970-01-01
      • 2017-09-16
      • 2020-06-23
      • 2020-05-31
      • 1970-01-01
      • 2021-07-10
      相关资源
      最近更新 更多