【问题标题】:How to populate an array with recordset data如何用记录集数据填充数组
【发布时间】:2011-01-25 04:51:00
【问题描述】:

我正在尝试将数据从记录集中直接移动到数组中。我知道这是可能的,但我特别想在 VBA 中执行此操作,因为这是在 MS Access 2003 中完成的。

通常我会执行以下操作来实现此目的:

    Dim vaData As Variant 
    Dim rst As ADODB.Recordset

    ' Pull data into recordset code here...

    ' Populate the array with the whole recordset.
    vaData = rst.GetRows 

VB 和 VBA 之间存在哪些差异导致这种类型的操作不起作用?

性能问题呢?这是一个“昂贵”的操作吗?

【问题讨论】:

  • 记录集是一个数组,比 VBA 数组更通用(即,按列名引用,而不仅仅是列索引)。为什么不直接使用记录集?我用 VBA/DAO 编程已经十多年了,从来没有使用过 GetRows。是什么让你觉得你需要它?
  • 专门用于最小化与其他 ADODB 对象的连接打开时间。
  • 那么 ADO 断开连接的记录集呢?
  • @David-W-Fenton - 如果您在 VBA/DAO 中编程,那么 .GetRows 更容易将数据作为一个块写入另一个应用程序(如 Excel),而无需通过循环填充。示例:ArrayA = Rst.GetRows(Rst.RecordCount)

标签: performance ms-access


【解决方案1】:

您的示例不起作用的通常原因是没有引用 ADO 的正确库(工具->引用,Microsoft ActiveX 数据对象 x.x 库),否则应该没问题。

【讨论】:

    【解决方案2】:

    我同意它看起来确实可能是一个参考问题。

    如果您要坚持使用 access/jet,那么您可能需要考虑使用 DAO,因为在所有条件相同的情况下,它会比 ADO 更快。这是一个简单的例子

    Public Sub Foo()
    Dim aFoo As Variant
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    
    Set db = DBEngine(0)(0)
    Set rst = db.OpenRecordset("tblFoo")
    
    With rst
        .MoveLast
        .MoveFirst
        aFoo = .GetRows(.RecordCount)
    End With
    
    rst.Close
    db.Close
    
    End Sub
    

    【讨论】:

      【解决方案3】:

      以下代码适用于我:

      Dim rst           As ADODB.Recordset
      Dim vDat          As Variant
      
      Set rst = CurrentProject.Connection.Execute("select * from tblTemp4")
      vDat = rst.GetRows
      

      进行调试编译,如前所述,这可能是参考问题。如前所述,有些人更喜欢 DAO,但请记住,DAO 要求你做最后的事情。 ADO 没有。如今,ADO 或 DAO 确实取决于您的偏好,并且性能很少成为问题。 ADO 往往比对象模型更简洁一些,但在大多数情况下,无论您的家人使用什么都是最好的选择

      【讨论】:

      • DAO 不需要 .MoveLast ,除非您想要一个准确的记录计数,而您几乎不需要(您只需要知道记录集是否返回记录,并且如果 DAO 记录计数始终为 1 或更多)记录集返回的记录)。我认为没有理由使用 ADO,它是 DEAD、DEAD、DEAD。 DAO 是实时数据库引擎的一部分,该引擎正在不断开发中,在我看来,它是处理 Jet/ACE 数据的未来。
      • 我现在从测试 GetRows 中看到,如果您不向它传递任何参数,它只会检索一行。您可以选择任意大的数字并跳过 .MoveLast 并避免性能下降。或者您可以通过检查表的 .RecordCount 属性来获得准确的记录计数,尽管这不适用于链接表,因此您必须直接使用后端(编码并不那么困难,而且肯定比MoveLast 在大型记录集上),但它不适用于单表记录集以外的任何东西。
      • 2020 年仍在使用 ADO。几乎没有死。比任何其他访问 SQL Server 的方法都要快得多。
      【解决方案4】:

      在 Access 中,您可以进行索引查找。这无疑是最快的方法,甚至比在数组中搜索还要快。

          Set rs = CreateObject("ADODB.Recordset")
          rs.CursorLocation = adUseServer
          rs.Open "MyData", CurrentProject.Connection, , , adCmdTableDirect
          rs.Index = "fieldX"
      
          rs.Seek fieldXvalue
      

      如果你只是循环遍历整个表,那么数组确实是最快的。一个例外:理论上,如果你有一个数字主键,你可以将索引设置为它在数组中的完全相同的位置,所以根本不需要 rs.find 或 rs.seek,你可以像 array(index) 一样访问它这真的很快。我没有针对索引搜索进行基准测试,但它可能会更快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-11
        • 2022-08-18
        • 1970-01-01
        相关资源
        最近更新 更多