2015-12-21 88 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'。「* –