在excel vba中从Access 2007运行参数查询时出错

时间:2011-06-30 18:15:39

标签: excel ms-access vba parameters syntax-error

我正在尝试从Excel 2007 VBA脚本在Access 2007数据库中运行查询。 Access查询具有名为“Year”和“Month”的参数。

我正在尝试使用以下代码:

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来运行相同的脚本,并得到了相同的错误。

2 个答案:

答案 0 :(得分:0)

我相信这些参数仅供您在访问时使用已保存的查询时使用。我会通过将参数移动到SQL语句来解决您的问题。

更改

"SELECT * FROM [Month_Totals]"

"SELECT * FROM [Month_Totals] WHERE Year = 2011 AND Month = 5"

答案 1 :(得分:0)

返回错误的原因是命令类型设置为adCmdtable,但命令不引用表,它引用SQL字符串,因此:

cmd.CommandType = adCmdText

接下来,为了返回特定数据,您需要包含一个WHERE子句,其中字段名称的参数顺序正确:

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