Excel VBA Sql: ADODB.Recordset - GetRows(index) 列模拟

Excel VBA Sql: ADODB.Recordset - GetRows(index) column analog

我是 VBA Sql 的新手,我写了一个 SQL 查询并得到了 ADODB.Recordset 结果。

我可以通过索引获取行值:

Dim rst As New ADODB.Recordset
Set rst.ActiveConnection = cn
rst.Open cmd

Dim myValues As Variant

myValues = rst.GetRows(1)

有什么方法可以按名称或索引获取列值吗?

在我的任务中,我首先需要知道记录集中的行数,然后创建一个具有此大小的数组 MyArr,迭代列 columnname 中的行(或使用索引 indexname),用recordset列中的值计算一些值,然后将计算结果写入MyArr.

怎样才能又快又准?

通常,一个记录集只能被读取一次,从头到尾(好吧,有一些方法可以打开一个记录集,以任何顺序访问记录,但通常这是不需要的,它也是并非所有数据源都支持)。

从记录集中获取数据的最简单方法是使用不带参数的GetRows,它将return所有行和列的值并将它们放入二维数组中。你只需要知道数组的第一个索引是列索引,第二个索引是行索引。注意两个维度的下标都是0.

Dim myValues
myValues = rst.GetRows   ' Read all data into 2-dimensional array

Debug.Print "# Cols: " & LBound(myValues, 1) & " to " & UBound(myValues, 1)
Debug.Print "# Rows: " & LBound(myValues, 2) & " to " & UBound(myValues, 2)

Dim myArr()
ReDim myArr(0 To UBound(myValues, 2))
Dim row As Long
For row = 0 To UBound(myValues, 2)
    ' myArr(row) = MagicCalculation(myValues(0, row), myValues(1, row), myValues(2, row))
Next row

' to list all field names:
Dim col As Long
For col = 0 To UBound(myValues, 1)
    Debug.Print col & ". field: " & rs.Fields(col)
Next col

为了直接获取值(而不是将整个记录集发送到数组),记录集被设计为使用“游标”。将光标移至所需行后,每个字段的 .value 属性 将成为该行中该字段的值。然后您可以使用字段名称或字段索引,例如 rs.fields("DateOfBirth").Value 或者,对于 shorthand,rs!DateOfBirth.Value.

可以通过多种方式将光标移动到特定位置,包括向前和向后移动光标的方法(rs.MoveNextrs.MovePrevious)和可以直接设置的属性(rs.AbsolutePositionrs.BookMark).

这些也可以与 rs.GetRows 一起使用。如果您将游标设置为 rs.AbsolutePosition = 10,那么 rs.GetRows(1) 将 return 只是将该行作为数组。 GetRows 还具有按名称或顺序位置 select 字段的参数,并指定要 return 的行数。请参阅 Microsoft documentation.