[英]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
我運行上面的VBA
從database
提取值。
它完全按照我的需要工作。
現在,我想使用在 Excel 電子表格中的Cell B1
中輸入的數據,而不是在strSQL
中使用預定義的日期。 因此,我將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
更改什么才能使其正常工作?
考慮使用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.