Ms access 记录集中循环的最快方式

Ms access 记录集中循环的最快方式,ms-access,vb6,recordset,Ms Access,Vb6,Recordset,我有一个VB6应用程序。我有两个记录集具有相同数量的记录(几乎50k)。现在我必须循环50k*50k*(字段数)。有谁能告诉我最快的方法吗 提前感谢。在vb6中确实没有最快的方法来实现这一点。 循环使用2 您可能希望向我们提供更多详细信息,了解为什么要拉取50k条记录(两次)并比较每个字段。这通常表示需要在数据库端执行某些操作,但已将其引入客户端以解决问题。如果两个数据库相同,唯一的区别是数据,则可以执行以下操作(伪代码): 选择t1.A、t2.A、t2.B、t2.B。。。 从t1开始 t1.i

我有一个VB6应用程序。我有两个记录集具有相同数量的记录(几乎50k)。现在我必须循环50k*50k*(字段数)。有谁能告诉我最快的方法吗


提前感谢。

在vb6中确实没有最快的方法来实现这一点。 循环使用2


您可能希望向我们提供更多详细信息,了解为什么要拉取50k条记录(两次)并比较每个字段。这通常表示需要在数据库端执行某些操作,但已将其引入客户端以解决问题。

如果两个数据库相同,唯一的区别是数据,则可以执行以下操作(伪代码):

选择t1.A、t2.A、t2.B、t2.B。。。
从t1开始
t1.id=t2.id上的内部连接t2
其中(t1.at2.A)或(t1.bt2.B)或。。。

t1和t2将是您的两张桌子。这不是最有效的方法,但它可以让您非常轻松地进行比较。此外,在SELECT语句中显示的内容可能会变得更复杂。目前,它只是两列并排的列表。

正如其他人指出的那样,在客户端执行此操作不是一个好主意,但这里有一些加速记录集访问的指针

  • 以仅向前(adOpenForwardOnly)方式打开记录集,如果不写入,则也以只读方式打开

  • 按编号引用字段,因此您将使用rs.fields(0)而不是rs.fields(“MyField”)

  • > p>如果你正在写回数据库,那么考虑在一个事务中把事情包起来以加快进度。

  • 循环时,使用“Do until rs.EOF”代替计数记录


这就是我现在能想到的,但它们应该会有所帮助。

在澄清了需要比较的两个Access数据库之后,最简单的方法是将这两个数据库链接在一起,然后用查询进行比较

右键单击空白处,
链接表

找到第二个数据库,选择其中的表


现在您可以编写一个查询来比较这两者。比较的数据在通过链接时总是最新的。

我已经编写了多次比较和同步两个数据表的代码,我在这里发布了相关信息。关键是使用SQL将结果限制为不匹配的记录,但主要的洞察是一次编写一列动态SQL。在每个SQL语句上使用WHERE子句,这将比任何其他比较方法更有效

在Access中,我编写了以下代码来从一个表更新另一个表。它假设两个表具有相同的字段,并且有一个PK字段实际标识两个表中的相同记录。代码依赖于mysqlrun()函数来实际执行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
公共函数UpdateTableData(ByVal strSourceTable作为字符串_
ByVal strTargetTable作为字符串,ByVal strJoinField作为字符串_
ByRef db作为DAO.Database,可选的ByVal strExcludeFieldsList作为字符串_
可选的ByVal strUpdatedBy为String=“Auto Update”_
可选的StradAdditionalCriteria(作为字符串)作为布尔值
Dim strUpdate作为字符串
将字段设置为DAO.Recordset
模糊fld为刀场
Dim strFieldName作为字符串
作为字符串的Dim strNZValue
作为字符串的Dim strSet
作为字符串的Dim strWhere
strUpdate=“UPDATE”&strTargetTable&“内部联接”&strSourceTable_
&“在”&strTargetTable&“&strJoinField&”上”_
&strSourceTable&“&”和strJoinField
'如果两个表中的字段名称不相同,
'创建一个别名字段的查询,以包含
'目标表
'如果源表位于其他数据库中,而您没有
'要创建链接表,请创建查询并指定
'将外部数据库作为表的源
'或者,对于strTargetTable,提供带有
'外部连接字符串
Set rsFields=db.OpenRecordset(strSourceTable)
对于rsFields.Fields中的每个fld
strFieldName=fld.Name
如果strFieldName strJoinField或(InStr(“,”和strExcludeFieldsList_
&“,”,strFieldName&“,”)0)然后
选择案例fld.Type
案例dbText,dbMemo
strNZValue=“”
其他情况
strNZValue=“0”
结束选择
strSet=“SET”&strTargetTable&“&strFieldName&”=_
varZLSToNull(“&strSourceTable&“&strFieldName&”)
strSet=strSet&“,”&strTargetTable&“.Updated=#”&Date&“#”
strSet=strSet&“,”&strTargetTable&“.UpdatedBy=”_
&STR_QUOTE&strudedby&STR_QUOTE
strWhere=“WHERE Nz(“&strTargetTable&”&strFieldName&”_
&strNZValue&“Nz”(&strSourceTable&“&strFieldName_
&“,”&strNZValue&“)
如果db.TableDefs(strTargetTable).Fields(fld.Name)
strWhere=strWhere&“和”&strSourceTable&“_
&strFieldName&“不为空”
如果结束
如果Len(StradAdditionalCriteria)>0,则
strWhere=strWhere&“AND”&标准
如果结束
调试。打印strUpdate&strSet&strWhere
Debug.Print SQLRun(strUpdate&strSet&strWhere,dbLocal)和“”_
&strFieldName&“已更新。”
如果结束
下一个fld
Debug.Print dbLocal.OpenRecordset(“从中选择计数(*)”_
&strTargetTable&“WHERE Updated=#”&Date&“AND UpdatedBy=”_
&STR_QUOTE&strudedby&STR_QUOTE)(0)_
&“在中更新的记录总数”&strTargetTable
斯菲尔德,关
设置rsFields=Nothing
UpdateTableData=True
端函数

尝试使用sql的算法,左边是一个
  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