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.MoveNext
、rs.MovePrevious
)和可以直接设置的属性(rs.AbsolutePosition
或 rs.BookMark
).
这些也可以与 rs.GetRows
一起使用。如果您将游标设置为 rs.AbsolutePosition = 10
,那么 rs.GetRows(1)
将 return 只是将该行作为数组。 GetRows 还具有按名称或顺序位置 select 字段的参数,并指定要 return 的行数。请参阅 Microsoft documentation.
我是 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.MoveNext
、rs.MovePrevious
)和可以直接设置的属性(rs.AbsolutePosition
或 rs.BookMark
).
这些也可以与 rs.GetRows
一起使用。如果您将游标设置为 rs.AbsolutePosition = 10
,那么 rs.GetRows(1)
将 return 只是将该行作为数组。 GetRows 还具有按名称或顺序位置 select 字段的参数,并指定要 return 的行数。请参阅 Microsoft documentation.