Excel VBA 从 MS Access 2003 执行存储的 UNION 查询

Excel VBA to Execute Stored UNION Query from MS Access 2003

我正在 Excel VBA 中编写一个函数来对使用 MS Access 2003 创建的数据库执行存储的查询。当存储的查询是一个简单的查询时,该代码有效,但不是如果查询是 UNION。例如,我使用以下代码来执行存储的查询:

Public Function QueryDB()

    Dim cn As Object

    Dim strConnection As String
    Set cn = CreateObject("ADODB.Connection")

    ' Hard code database location and name
    strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\server1\myDatabase.mdb"

    ' Open the db connection
    cn.Open strConnection

    ' Create call to stored procedure on access DB
    Dim cmd As Object
    Set cmd = CreateObject("ADODB.Command")
    cmd.CommandType = adCmdStoredProc
    cmd.CommandText = "testQuery"
    cmd.ActiveConnection = cn

    ' Execute stored query
    Dim rs As ADODB.Recordset
    Set rs = cmd.Execute()

    MsgBox rs.Fields(0) ' prints as expected

    QueryDB2 = rs.Fields(0)


    ' close connections
    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing

End Function

如果 testQuery 是一个简单的查询(例如,不使用 UNION),则按预期返回数据。但是,如果 testQuery 包含 UNION,则 Excel VBA 代码会失败(并且不会返回任何特定错误)。我该如何解决这个问题?我想避免在 VBA.

中编写 SQL 语句

考虑使用 ADO 的 Open Recordset method. Usually, Execute 用于操作命令(append/update/delete、存储过程等)。此外,如果执行 returns 一个记录集,它只是一个只进(即没有游标的快照)、只读记录集,没有 MoveNextRecordCount、[=13 的功能=].

Dim cn As Object
Dim rst As Object

Dim strConnection As String
Set cn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")

' Hard code database location and name
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\server1\myDatabase.mdb"

' Open the db connection
cn.Open strConnection
' Open the recordset
rst.Open "testQuery", cn

Sheets(1).Range("A2").CopyFromRecordset rst

' Close recordset and db connection
rst.Close
cn.Close

你还在为这个烦恼吗?尝试使用 ODBC 查询。按照此处列出的步骤进行操作。

http://translate.google.pl/translate?js=n&prev=_t&hl=pl&ie=UTF-8&layout=2&eotf=1&sl=pl&tl=en&u=http%3A%2F%2Fafin.net%2FKsiazkaSQLwExcelu%2FGraficznyEdytorZapytanSqlNaPrzykladzieMsQuery.htm

确保您的 Union 中没有空值,如果有,您必须使用 NZ 函数将空值转换为零。