如何将Access查询结果保存到VBA中的一个对象中?

How to save Access query result into an object in VBA?

我无法将 Access 查询的全部结果写入对象。

这是示例代码。

Sub test()

Dim cn As Object
Dim strConnection As String
Dim rs As Object

Set cn = CreateObject("ADODB.Connection")
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Test.mdb;Jet OLEDB:Database Password=pass;"

cn.Open strConnection

'Write some test data
cn.Execute ("CREATE TABLE TestTable (ID int, Column_1 varchar(255), Column_2 varchar(255));")
cn.Execute ("INSERT INTO TestTable (ID, Column_1, Column_2) VALUES (1, ""Foo"", ""Bar"")")
cn.Execute ("INSERT INTO TestTable (ID, Column_1, Column_2) VALUES (2, ""Bar"", ""Foo"")")
cn.Execute ("INSERT INTO TestTable (ID, Column_1, Column_2) VALUES (3, ""FooBar"", ""BarFoo"")")

'Get the data
Set rs = cn.Execute("SELECT * FROM TestTable")

cn.Close

End Sub

我在监视列表中查看 rs 时似乎只得到第一行,在字段下有项目 1 = 1,项目 2 = Foo,项目 3 = Bar。

在 Python 上使用 PyODBC 我习惯使用 fetchall 方法,但我没有找到 ADODB 的类似方法。

访问查询 returns 所有 3 行。

对象类型有误吗?我也试过 "Set rs = New ADODB.Recordset" 但它确实有帮助。那么如何将所有 3 行写入对象?

FetchAll 的粗略等价于 GetRows:

Dim cn As Object
Dim strConnection As String
Dim rowdata As Variant

Set cn = CreateObject("ADODB.Connection")
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Test.mdb;Jet OLEDB:Database Password=pass;"

cn.Open strConnection

'Write some test data
cn.Execute ("CREATE TABLE TestTable (ID int, Column_1 varchar(255), Column_2 varchar(255));")
cn.Execute ("INSERT INTO TestTable (ID, Column_1, Column_2) VALUES (1, ""Foo"", ""Bar"")")
cn.Execute ("INSERT INTO TestTable (ID, Column_1, Column_2) VALUES (2, ""Bar"", ""Foo"")")
cn.Execute ("INSERT INTO TestTable (ID, Column_1, Column_2) VALUES (3, ""FooBar"", ""BarFoo"")")

'Get the data
rowdata = cn.Execute("SELECT * FROM TestTable").GetRows()

cn.Close

通常,首选使用记录集,因为记录集仅在需要时加载数据(例如,当您使用 rs.MoveNext 时,将加载下一条记录,而不是立即加载它),并且记录集链接到数据源,因此可用于将新行插入 table。 GetRows 在 VBA 中的用例很少。

首先,我不建议使用 GetRows,除非您想从一个非常棒的记录集对象(具有漂亮的字段和 movenext 等)转换为难以使用的多维数组。

下一个:

当您使用 rs.execute 时,您将获得一个仅向前的记录集,并且您只能检查现有记录的记录计数(它始终为 -1)。因此,您只能使用 .recordCount 检查记录 - 无法获取实际的记录数。

因为上面的原因,你想在打开命令中指定"cursor"类型。

所以,使用:

Dim strSQL     As String

strSQL = "select * from tblHotels where City like 'Edmon%' "

rstD.CursorLocation = adUseClient
rstD.Open strSQL, rstDCon
Debug.Print rstD.RecordCount

还有其他几种设置游标(记录集)类型的方法,您也可以随心所欲: rstD.CursorLocation = adUseClient,但执行命令在大多数情况下会覆盖该设置。既然你需要额外的代码行,那就用记录集的.Open方法来做吧。

所以:

'Get the data
Set rs = cn.Execute("SELECT * FROM TestTable")

变成

'Get the data
rs.Open "SELECT * FROM TestTable", cn, adUseClient
debug.print rs.RecordCount

不清楚您是否使用后期绑定,因此您必须将常量 adUseClient 替换为 3

例如:

'Get the data
rs.Open "SELECT * FROM TestTable", cn, 3
debug.print rs.RecordCount