【问题标题】:Excel VBA Sql: ADODB.Recordset - GetRows(index) column analogExcel VBA Sql:ADODB.Recordset - GetRows(index) 列模拟
【发布时间】:2021-02-23 05:27:35
【问题描述】:

我是 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)中的行,使用计算一些值记录集列中的值,然后将计算结果写入MyArr

怎样才能又快又准呢?

【问题讨论】:

    标签: sql excel vba adodb


    【解决方案1】:

    通常,一个记录集只能从头到尾读取一次(嗯,有一些方法可以打开一个记录集以按任意顺序访问记录,但通常不需要,也不支持来自所有数据源)。

    从记录集中获取数据最简单的方法是使用不带参数的GetRows,它将返回所有行和列的值并将它们放入一个二维数组中。您只需要知道数组的第一个索引是列索引,第二个索引是行索引。注意两个维度的下限索引都是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
    

    【讨论】:

      【解决方案2】:

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

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

      这些也可以与rs.GetRows 一起使用。如果将光标设置为rs.AbsolutePosition = 10,则rs.GetRows(1) 将只返回该行作为数组。 GetRows 还具有按名称或序号位置选择字段并指定要返回的行数的参数。请参阅 Microsoft documentation

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-06
        • 1970-01-01
        • 2014-01-24
        • 2019-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-02
        相关资源
        最近更新 更多