簡體   English   中英

使用 Excel 單元格中的值作為 SQL 查詢中 WHERE 子句的條件

[英]Use value in Excel cell as condition for WHERE clause in SQL query

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

我運行上面的VBAdatabase提取值。
它完全按照我的需要工作。


現在,我想使用在 Excel 電子表格中的Cell B1中輸入的數據,而不是在strSQL中使用預定義的日期。 因此,我將VBAstrSQL部分更改為:

        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更改什么才能使其正常工作?

考慮使用ADO 命令對象的SQL 參數化的行業最佳實踐,該對象可以正確處理數據類型而無需字符串連接或各種格式:

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

嘗試:

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

請注意,如果insert_timestamp確實包含午夜以外的時間,則如果不轉換為日期或更改 SQL,您可能無法獲得所需的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM