Ошибка при запуске запроса параметров из Access 2007 в excel vba

Я пытаюсь выполнить запрос в базе данных Access 2007 из сценария Excel 2007 VBA. Запрос доступа имеет параметры, называемые «Год» и «Месяц».

Я пытаюсь заставить работать следующий код:

Sub RunMyQuery()

    Dim cn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim dbPath As String
    Dim stQRY As String
    Dim stCon As String
    Dim cmd As New ADODB.Command
    Dim prmYear As New ADODB.Parameter
    Dim prmMonth As New ADODB.Parameter

    dbPath = "<PATH_TO_MY_DB>"

    stCon = "Provider=Microsoft.ACE.OLEDB.12.0;" _
         & "Data Source=" & dbPath & ";"

    cn.Open (stCon)
    cn.CursorLocation = adUseClient

    Set cmd.ActiveConnection = cn

    Set prmYear = cmd.CreateParameter("Year", adNumeric, adParamInput, , 2011)
    Set prmMonth = cmd.CreateParameter("Month", adNumeric, adParamInput, , 5)

    cmd.Parameters.Append prmYear
    cmd.Parameters.Append prmMonth

    cmd.CommandText = "SELECT * FROM [Month_Totals]"
    cmd.CommandType = adCmdTable

    Set rs = cmd.Execute

    Sheets("Sheet1").Range("A1").CopyFromRecordset rs

    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing

End Sub

Когда я запускаю это, код останавливается на "cmd.Execute" с

Ошибка времени выполнения «-214217900 (80040e14)»:

Синтаксическая ошибка в предложении FROM.

Что я ошибаюсь?

  • Текст команды мне кажется достаточно простым. Я что-то там упустил?

  • Неправильно ли я использую параметры ADODB.Command? Я не думаю, что здесь проблема, потому что я пробовал запустить тот же скрипт с непараметризованным запросом, замененным на Month_Totals, и получил ту же ошибку.


person Isaac Moses    schedule 30.06.2011    source источник
comment
Я не знаю, применимо ли это (я работаю в Access напрямую, поэтому никогда не использую ADODB), но я думаю, что нет именованных параметров, поэтому вам нужно работать с ними по порядку.   -  person David-W-Fenton    schedule 01.07.2011


Ответы (2)


Я считаю, что параметры предназначены только для использования, когда вы используете сохраненный запрос в доступе. Я бы решил вашу проблему, переместив параметры в статус SQL.

Изменять

"SELECT * FROM [Month_Totals]"

to

"SELECT * FROM [Month_Totals] WHERE Year = 2011 AND Month = 5"
person Pynner    schedule 25.09.2011

Причина, по которой это возвращает ошибку, заключается в том, что тип команды установлен на adCmdtable, но команда не ссылается на таблицу, она ссылается на строку SQL, поэтому:

cmd.CommandType = adCmdText

Затем, чтобы вернуть определенные данные, вам необходимо включить предложение WHERE с именами полей в правильном порядке для параметров:

cmd.CommandText = "SELECT * FROM [Month_Totals] Where [Year]=? AND [Month]=?"
person Fionnuala    schedule 25.09.2011