我正在Excel VBA中编写一个函数来对使用MS Access 2003创建的数据库执行存储查询。当存储的查询是简单查询时,代码可以工作,但如果查询是{{1 }}。例如,我使用以下代码执行存储的查询:
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
,则Excel VBA代码将失败(并且不会返回特定错误)。我该如何解决这个问题?我想避免在VBA中编写SQL语句。
答案 0 :(得分:1)
考虑使用ADO的Open Recordset方法。通常,Execute用于操作命令(追加/更新/删除,存储过程等)。此外,如果Execute返回一个记录集,它只是一个仅向前(即没有游标的快照),只有MoveNext
,RecordCount
,Update
的设施的只读记录集。 / p>
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
答案 1 :(得分:1)
你还在苦苦挣扎吗?尝试使用ODBC查询。请按照此处列出的步骤进行操作。
确保您的Union中没有空值,如果这样做,则必须使用NZ函数将空值转换为零。