Excel VBA执行MS Access 2003中存储的UNION查询
问题描述:
我正在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语句。
答
考虑使用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
答
你还在为此苦苦挣扎吗?尝试使用ODBC查询。按照此处列出的步骤操作。
请确保您有没有空在你的联盟,如果你这样做,你必须使用新西兰功能,以空转换成零。
同样,这不幸的只适用于常规查询,而不适用于包含UNION语句的查询。 –
非常有趣,因为我在上面用联合查询进行了测试。你能发布你的联合SQL查询,甚至可能是样本数据吗? – Parfait
尽管这个查询没有意义,但它仍然是我能想到的最简单的,并且不起作用。 'SELECT * FROM myTable UNION SELECT * FROM myTable;'。我在数据库中保存了这个查询,当试图访问Excel中的结果集时,VBA返回运行时错误*“无效的SQL语句;预期的'DELETE','INSERT','PROCEDURE','SELECT' ,或'UPDATE'。“* –