Использовать значение в ячейке Excel в качестве условия для предложения WHERE в запросе SQL - PullRequest
0 голосов
/ 11 марта 2020
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 Я хочу использовать данные, которые вводятся в Cell B1 в моем Excel электронные таблицы. Поэтому я изменил strSQL часть в VBA на:

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

Однако теперь я получаю runtime error -2147217887 (80040e21) на rs.Open strSQL, conn, adOpenStatic.

Что мне нужно изменить по моему VBA чтобы это заработало?

Ответы [ 2 ]

3 голосов
/ 11 марта 2020

Рассмотрим лучшие в отрасли практики SQL параметризации с использованием ADO Command объекта, который может правильно обрабатывать типы данных без объединения строк или различного форматирования:

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
1 голос
/ 11 марта 2020

Попробуйте:

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

Имейте в виду, что если insert_timestamp действительно содержит время , отличное от полуночи, вы можете не получить результаты, которые вы после преобразования без конвертации в просто дату или изменения вашего SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...