Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Перебор записей в цикле (ADO) / 5 сообщений из 5, страница 1 из 1
08.07.2003, 14:10
    #32201984
D.Yesieff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перебор записей в цикле (ADO)
rs.Open "select D_REG from dokument", db, adOpenDynamic, adLockBatchOptimistic

Do While Not rs.EOF
rs.Fields(0).Value = Моя_функция (rs.Fields(0).Value)
rs.Update
rs.MoveNext

Loop

табличка по SQl server

пробовал для небольшого набора записей - на ура
для 20-30 тыс. облом что изменить ? или только хр.процедурой залечит?
...
Рейтинг: 0 / 0
08.07.2003, 18:14
    #32202470
big-duke
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перебор записей в цикле (ADO)
попробуйте так называемые курсоры-брандспойты:
CursorLocation=aduseServer
CursorType=adOpenForwardOnly
LockType=adLockReadOnly
CashSize=1
...
Рейтинг: 0 / 0
09.07.2003, 11:09
    #32202861
D.Yesieff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перебор записей в цикле (ADO)
Спасибо вроде помогло токо
LockType = adLockOptimistic

а зачем используется CashSize ?
...
Рейтинг: 0 / 0
09.07.2003, 21:16
    #32203772
ulis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перебор записей в цикле (ADO)
Вопрос - зачем для обновления использовать цикл? Если попробовать просто запрос на обновление. Поскольку в качестве нового значения используется функция (как я понял, клиентская), параметр которой - некоторое поле из обновляемой таблицы (не обязательно), то в лоб задачу не решить: я тут маленько поэксперементировал с таблицей, у которой 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

Итог - первый метод на два порядка быстрее и позволяет использовать строковое выражение функций, что может быть очень удобно
...
Рейтинг: 0 / 0
14.07.2003, 11:15
    #32206841
D.Yesieff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перебор записей в цикле (ADO)
Интересный вариант
Будем прогать
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Перебор записей в цикле (ADO) / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]