2015-12-21 84 views
1

我正在Excel VBA中编写一个函数,用于对使用MS Access 2003创建的数据库执行存储查询。当存储的查询是简单查询如果查询是UNION,则不应该。例如,我使用以下代码以执行该存储的查询: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语句。

回答

1

考虑使用ADO的Open Recordset方法。通常,Execute用于操作命令(追加/更新/删除,存储过程等)。另外,如果Execute返回一个记录集,它只是一个只向前(即没有光标的快照),没有MoveNext,RecordCount,Update设施的只读记录集。

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 
+0

同样,这不幸的只适用于常规查询,而不适用于包含UNION语句的查询。 –

+0

非常有趣,因为我在上面用联合查询进行了测试。你能发布你的联合SQL查询,甚至可能是样本数据吗? – Parfait

+0

尽管这个查询没有意义,但它仍然是我能想到的最简单的,并且不起作用。 'SELECT * FROM myTable UNION SELECT * FROM myTable;'。我在数据库中保存了这个查询,当试图访问Excel中的结果集时,VBA返回运行时错误*“无效的SQL语句;预期的'DELETE','INSERT','PROCEDURE','SELECT' ,或'UPDATE'。“* –