记录集中最快的循环方式

时间:2011-06-13 14:01:30

标签: ms-access vb6 recordset

我有一个VB6应用程序。我有2个记录集具有相同的记录数(几乎50k)。现在我必须循环50k * 50k *(字段数)。任何人都可以告诉我最快的方法吗?

提前致谢。

6 个答案:

答案 0 :(得分:2)

正如其他人指出的那样做这个客户端并不是一个好主意,但这里有一些指示来加速记录集访问。

  • 仅将记录集打开(adOpenForwardOnly),如果您不写,则只读。

  • 按编号引用字段,而不是使用rs.Fields(“MyField”),而是使用rs.Fields(0)

  • 如果您要回写数据库,请考虑在事务中包装以加快速度。

  • 循环使用“直到rs.EOF”而不是计算记录。

这就是我现在所能想到的一切,但他们应该帮助一下

答案 1 :(得分:1)

在vb6中确实没有最快的方法。 你将使用2 for循环。

您可能希望向我们提供更多详细信息,说明为什么要提取50k记录(两次)并比较每个字段。这通常表明需要在数据库端完成某些工作,但需要在客户端进行解决。

答案 2 :(得分:0)

如果你的两个数据库是相同的,唯一的区别是数据,你可以这样做(伪代码):

SELECT t1.A, t2.A, t2.B, t2.B, ...
FROM t1
INNER JOIN t2 on t1.id = t2.id
WHERE (t1.A <> t2.A) OR (t1.B <> t2.B) OR ...

t1和t2将是你的两张桌子。这不是最有效的,但它可以让你很容易地进行比较。此外,您可能会在SELECT语句中显示更复杂的内容。目前它只是两个列并列的列表。

答案 3 :(得分:0)

澄清您需要比较两个Access数据库,最简单的方法是将两者连接在一起,然后与查询进行比较。

右键单击空白空格Link tables 找到第二个DB,选择其中的表。

现在您可以编写一个查询来比较这两者。被比较的数据始终是最新的,因为它是通过链接拉出来的。

答案 4 :(得分:0)

我编写了很多代码来比较和同步两个数据表的代码,我在SO上发布了它。关键是使用SQL将结果限制为不匹配的记录,但主要的见解是一次编写即时SQL一列。对每个SQL语句使用WHERE子句,这将比任何其他比较方法更有效。

在Access中,我编写了这段代码来更新另一个表。它假设表具有相同的字段,并且有一个PK字段实际上标识了两个表中的相同记录。代码依赖于我的SQLRun()函数来实际执行SQL,但是如果你不想这样,可以用CurrentDB.Execute替换该行。

  Public Function UpdateTableData(ByVal strSourceTable As String, _
      ByVal strTargetTable As String, ByVal strJoinField As String, _
      ByRef db As DAO.Database, Optional ByVal strExcludeFieldsList As String, _
      Optional ByVal strUpdatedBy As String = "Auto Update", _
      Optional strAdditionalCriteria As String) As Boolean
    Dim strUpdate As String
    Dim rsFields As DAO.Recordset
    Dim fld As DAO.Field
    Dim strFieldName As String
    Dim strNZValue As String
    Dim strSet As String
    Dim strWhere As String

    strUpdate = "UPDATE " & strTargetTable & " INNER JOIN " & strSourceTable _
        & " ON " & strTargetTable & "." & strJoinField & " = " _
        & strSourceTable & "." & strJoinField
    ' if the fields don't have the same names in both tables,
    '   create a query that aliases the fields to have the names of the
    '   target table
    ' if the source table is in a different database and you don't
    '   want to create a linked table, create a query and specify
    '   the external database as the source of the table
    ' alternatively, for strTargetTable, supply a SQL string with
    '   the external connect string
    Set rsFields = db.OpenRecordset(strSourceTable)
    For Each fld In rsFields.Fields
      strFieldName = fld.Name
      If strFieldName <> strJoinField Or (InStr(", " & strExcludeFieldsList _
           & ",", strFieldName & ",") <> 0) Then
         Select Case fld.Type
           Case dbText, dbMemo
             strNZValue = "''"
           Case Else
             strNZValue = "0"
         End Select
         strSet = " SET " & strTargetTable & "." & strFieldName & " = _
             varZLSToNull(" & strSourceTable & "." & strFieldName & ")"
         strSet = strSet & ", " & strTargetTable & ".Updated = #" & Date & "#"
         strSet = strSet & ", " & strTargetTable & ".UpdatedBy = " _
             & STR_QUOTE & strUpdatedBy & STR_QUOTE
         strWhere = " WHERE Nz(" & strTargetTable & "." & strFieldName & ", " _
             & strNZValue & ") <> Nz(" & strSourceTable & "." & strFieldName _
             & ", " & strNZValue & ")"
         If db.TableDefs(strTargetTable).Fields(fld.Name).Required Then
            strWhere = strWhere & " AND " & strSourceTable & "." _
                & strFieldName & " Is Not Null"
         End If
         If Len(strAdditionalCriteria) > 0 Then
            strWhere = strWhere & " AND " & strAdditionalCriteria
         End If
         Debug.Print strUpdate & strSet & strWhere
         Debug.Print SQLRun(strUpdate & strSet & strWhere, dbLocal) & " " _
           & strFieldName & " updated."
      End If
    Next fld
    Debug.Print dbLocal.OpenRecordset("SELECT COUNT(*) FROM " _
       & strTargetTable & " WHERE Updated=#" & Date & "# AND UpdatedBy=" _
       & STR_QUOTE & strUpdatedBy & STR_QUOTE)(0) _
       & " total records updated in " & strTargetTable
    rsFields.Close
    Set rsFields = Nothing
    UpdateTableData = True
  End Function

答案 5 :(得分:-1)

尝试使用sql。的算法,左右连接。,然后将其应用于vb ..,

我也有同样的问题,但我尝试了解决方案,它的工作..,首先,完成查询需要将近3个小时但是当我应用sql算法时,它只需要很少的minis