MyTetra Share
Делитесь знаниями!
Перебор записей в цикле (ADO)
Время создания: 06.03.2020 07:46
Текстовые метки: VBA, ADO, EOF
Раздел: !Закладки - VBA - Access - ADO
Запись: xintrea/mytetra_db_adgaver_new/master/base/15834696053fmcqccjxa/text.html на raw.githubusercontent.com

Вопрос - зачем для обновления использовать цикл? Если попробовать просто запрос на обновление. Поскольку в качестве нового значения используется функция (как я понял, клиентская), параметр которой - некоторое поле из обновляемой таблицы (не обязательно), то в лоб задачу не решить: я тут маленько поэксперементировал с таблицей, у которой 62 тыс. записей:

 

Option Explicit

 

Private Sub cmdTest_Click()

 

    Dim cnn                   As New ADODB.Connection

    Dim strConn               As String

    Dim strSQL                As String

    Dim rst                   As New ADODB.Recordset

    Dim tStart                As Date

    Dim tEnd                  As Date

 

    rst.CursorLocation = adUseClient

    rst.LockType = adLockPessimistic

 

    strConn = "Provider=SQLOLEDB.1;Password=1111;Persist Security Info=False;User ID=fake;Initial Catalog=mkvd;Data Source=10.80.180.108"

    cnn.Open strConn

    ' Таблица содержит около 62 тыс. записей

    ' Первый вариант - с помощью UPDATE запроса. На выполнение запроса затрачено около 2-х секунд. В качестве нового значения выступает результат пользовательской функции dbo.fnTest, которая хранится на сервере. У пользователя должны быть права на ее выполнение

 

 

 

    strSQL = "UPDATE tblСтатТалон SET ВозрБольного=dbo.fnTest([ВозрБольного])"

 

    tStart = Time

    DoEvents

    cnn.Execute (strSQL)

    tEnd = Time

 

    MsgBox "update запрос затратил " & DateDiff("s", tStart, tEnd) & " секунд(ы)"

 

    ' Второй вариант: с помощью набора и цикла. На выпоолнение запроса затрачено около 130 секунд. Тут без слов все ясно.

    strSQL = "SELECT ВозрБольного FROM tblСтатТалон"

    rst.Open strSQL, cnn

 

    tStart = Time

    DoEvents

    Do Until rst.EOF

        rst![ВозрБольного] = 10

        rst.MoveNext

    Loop

    tEnd = Time

 

    MsgBox "do loop затратил " & DateDiff("s", tStart, tEnd) & " секунд(ы)"

 

    If cnn.State = 1 Then

        cnn.Close

        Set cnn = Nothing

    End If

 

    If rst.State = 1 Then

        rst.Close

        Set rst = Nothing

    End If

 

End Sub

 

Итог - первый метод на два порядка быстрее и позволяет использовать строковое выражение функций, что может быть очень удобно

Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования