Самый быстрый способ зацикливания в наборе записей - PullRequest
0 голосов
/ 13 июня 2011

У меня есть приложение VB6.У меня есть 2 набора записей, имеющих одинаковое количество записей (почти 50 КБ).Теперь я должен зациклить 50k * 50k * (количество полей).Кто-нибудь может сказать мне самый быстрый способ сделать это?

Заранее спасибо.

Ответы [ 6 ]

2 голосов
/ 14 июня 2011

Как уже отмечали другие, не стоит делать это на стороне клиента, но вот несколько советов по ускорению доступа к набору записей.

  • Открыть набор записей только для пересылки (adOpenForwardOnly), и если вы не пишете, то только для чтения.

  • См. поля по номерам, поэтому вместо использования rs.Fields («MyField») вы должны использовать rs.Fields (0)

  • Если вы выполняете обратную запись в базу данных, рассмотрите возможность объединения вещей в транзакции, чтобы ускорить процесс.

  • При циклическом использовании«Делай до rs.EOF» вместо подсчета записей.

Это все, что я могу себе представить, но они должны немного помочь

1 голос
/ 13 июня 2011

В vb6 нет самого быстрого способа сделать это. Вы бы использовали 2 для петель.

Возможно, вы захотите дать нам более подробную информацию о том, почему вы собираете 50 тыс. Записей (дважды) и сравниваете каждое поле. Обычно это указывает на то, что что-то должно быть сделано на стороне базы данных, но было перенесено на сторону клиента для решения.

0 голосов
/ 23 июня 2011

попробуйте использовать алгоритм sql., Левое и правое объединение., Затем примените его в vb ..,

У меня тоже такая же проблема с вами, но я пробую это решение и оно работает.. Во-первых, на выполнение запроса уходит почти 3 часа, но когда я применяю алгоритм sql, требуется всего несколько минут

.
0 голосов
/ 16 июня 2011

Я написал код для сравнения и синхронизации двух таблиц данных много-много раз, и я написал об этом здесь, в SO. Ключ заключается в том, чтобы использовать SQL, чтобы ограничить результаты записями, которые не совпадают, но главная идея заключается в том, чтобы написать свою ОДНУ КОЛОННУ SQL на лету. С предложением WHERE для каждого из ваших операторов SQL это будет намного эффективнее, чем любой другой метод сравнения.

В 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
0 голосов
/ 15 июня 2011

Уточнив, что у вас есть две базы данных Access, которые нужно сравнить, проще всего связать их вместе, а затем сравнить с запросом.

Щелкните правой кнопкой мыши белое пустое пространство, Link tables.
Найдите свою вторую БД, выберите в ней таблицу.

Теперь вы можете написать запрос для сравнения двух. Сравниваемые данные всегда актуальны, так как они передаются по ссылке.

0 голосов
/ 13 июня 2011

Если ваши две базы данных совпадают, и единственное отличие - это данные, вы можете сделать что-то вроде этого (псевдокод):

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. В настоящее время это просто список обеих колонок рядом.

...