powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как правильно работать с ADO рекордсетом в рекурсиях?
25 сообщений из 28, страница 1 из 2
Как правильно работать с ADO рекордсетом в рекурсиях?
    #33352856
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим есть глобальный рекордсет

Код: plaintext
Public rstWork As ADODB.Recordset

При загрузке формы мы его инициализируем

Код: plaintext
Set rstWork = New ADODB.Recordset

И далее в одной функции гоним рекурсию

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Function Req(...) as Long

    ...
    rstWork.Open strSQL, cnnData, adOpenKeyset, adLockOptimistic
    rstWork.AddNew
    ...
    rstWork.Update
    rstWork.Close
    
    W = Req(...)
    Req = W.aaa

End Sub

Не опасно ли так работать с рекордсетом и не получится ли в памяти каша?
Или в каждой рекурсии объявлять свой рекодсет, а не держать его глобальным?
Нужно ли его закрывать в рекурсии или не страшно?
...
Рейтинг: 0 / 0
Как правильно работать с ADO рекордсетом в рекурсиях?
    #33352900
TIKO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При каждом использовании
Set rstWork = New ADODB.Recordset
после выполнения используй оператор
Set rstWork = NOTHING

что бы освободить память от объекта
по мне так лучше использовать локальные переменные поскольку
при ошибке с рекордсетом он остается открытым и использовать его еще раз будет проблеммой

Еще не мешало бы ввести
On Error GoTo Er

..........................
..........................
Exit Sub
er:
Set rstWork = NOTHING
...
Рейтинг: 0 / 0
Как правильно работать с ADO рекордсетом в рекурсиях?
    #33353370
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю что в теле рекурсивной процедуры надо держать только простые переменные.
А рекордсет объявить на уровне модуля.
Иначе на создание экземпляров рекордсета будет тратиться много времени.
И сборщик мусора добавит тормозов собирая остатки от каждого рекордсета.

Есть смысл использовать adLockBatchOptimistic-рекордсет.
...
Рейтинг: 0 / 0
Как правильно работать с ADO рекордсетом в рекурсиях?
    #33353893
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть смысл использовать adLockBatchOptimistic-рекордсет.[/quot]
Можно немного подробнее?

Кстати, рекордсет на уровне модуля объявить не получится, иначе функция выдает ошибку что он уже открыт, действительно он же открыт в предыдущем вызове функции по рекурсии, а последующие вызывы пытаются открыть его же, так что придется видимо в каждом вызове рекурсии. Придется в каждом вызове фенкции создавать свой рекордсет, а это тормоза...
Что примечательно, в Access при такой схеме собственных рекордсетов в каждой функции скорость выполнения сильно превосходит скорость в VB.
...
Рейтинг: 0 / 0
Как правильно работать с ADO рекордсетом в рекурсиях?
    #33353922
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А нельзя никак такой вот альгоритм

Код: plaintext
1.
2.
3.
4.
5.
       With RST
            .AddNew
            .Fields("Text") = "bla-bla-bla"
            .Update 
            lngID= RST!ID
        End With

провернуть без рекордсета? Т.е. нужно добавить запись в таблицу и получить ее ID. База MDB.
...
Рейтинг: 0 / 0
Как правильно работать с ADO рекордсетом в рекурсиях?
    #33354036
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как ускорить открытие рекодсета на добавление одной записи? Юаза однопользовательская MDB.
Пока открываю так:

Код: plaintext
rstElements.Open "Select * From Table where false", cnnData, adOpenKeyset, adLockOptimistic
...
Рейтинг: 0 / 0
Как правильно работать с ADO рекордсетом в рекурсиях?
    #33354318
TIKO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почему бы тебе не использовать commands для изменения удаления и обнавтения записей, рекордсеты больше предназначена на выборку данных а для изменения данных они медленее работают
вот пример

Dim s As New Command
With s
.ActiveConnection = conn
.CommandType = adCmdText
.CommandText = "INSERT INTO TABLE(T1,T2,T3) VALUES('привет',150,'пока')"
.Execute
End With
если нужно использовать переменные VB для ввода то можно зделать так
"INSERT INTO TABLE(T1,T2,T3) VALUES('" & Техт1.Text &"'," & Техт2.Text & ",'" & Техт2.Text & "')"
или через конструктор Command (DE) использовать параметры для ввода
...
Рейтинг: 0 / 0
Как правильно работать с ADO рекордсетом в рекурсиях?
    #33354319
TIKO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
With RST
.AddNew
.Fields("Text") = "bla-bla-bla"
.Update
.MoveFirst
lngID= RST!ID
End With
может так сработает
...
Рейтинг: 0 / 0
Как правильно работать с ADO рекордсетом в рекурсиях?
    #33354366
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напишите что конкретно хотите сделать этой рекурсивной процедурой, может решение какое-нибудь найдется.
...
Рейтинг: 0 / 0
Как правильно работать с ADO рекордсетом в рекурсиях?
    #33355079
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TIKOПочему бы тебе не использовать commands для изменения удаления и обнавтения записей, рекордсеты больше предназначена на выборку данных а для изменения данных они медленее работают
вот пример

Dim s As New Command
With s
.ActiveConnection = conn
.CommandType = adCmdText
.CommandText = "INSERT INTO TABLE(T1,T2,T3) VALUES('привет',150,'пока')"
.Execute
End With
если нужно использовать переменные VB для ввода то можно зделать так
"INSERT INTO TABLE(T1,T2,T3) VALUES('" & Техт1.Text &"'," & Техт2.Text & ",'" & Техт2.Text & "')"
или через конструктор Command (DE) использовать параметры для ввода

Я пользуюсь рекордсетом только потому что мне нужно получить ID добавляемой записи.
...
Рейтинг: 0 / 0
Как правильно работать с ADO рекордсетом в рекурсиях?
    #33355082
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TIKOWith RST
.AddNew
.Fields("Text") = "bla-bla-bla"
.Update
.MoveFirst
lngID= RST!ID
End With
может так сработает
Не понял, что сработает и к чему тут MoveFirst?
...
Рейтинг: 0 / 0
Как правильно работать с ADO рекордсетом в рекурсиях?
    #33355083
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WorobjoffНапишите что конкретно хотите сделать этой рекурсивной процедурой, может решение какое-нибудь найдется.
Перебор файлов и папок на диске и занесение их в базу.
...
Рейтинг: 0 / 0
Как правильно работать с ADO рекордсетом в рекурсиях?
    #33355139
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А надо ли синхронизовать то что в базе с тем что на диске?
Или достаточно убить все записи и создать снова?
...
Рейтинг: 0 / 0
Как правильно работать с ADO рекордсетом в рекурсиях?
    #33355295
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pantalone Я пользуюсь рекордсетом только потому что мне нужно получить ID добавляемой записи

ID- можно формировать в басикеи заносить уже с готовым ID, тогда и не будет проблем с вложенным рекордсетом
...
Рейтинг: 0 / 0
Как правильно работать с ADO рекордсетом в рекурсиях?
    #33355418
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HandKot Pantalone Я пользуюсь рекордсетом только потому что мне нужно получить ID добавляемой записи

ID- можно формировать в басикеи заносить уже с готовым ID, тогда и не будет проблем с вложенным рекордсетом
Или использовать
Код: plaintext
select scope_identity()
...
Рейтинг: 0 / 0
Как правильно работать с ADO рекордсетом в рекурсиях?
    #33355522
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WorobjoffА надо ли синхронизовать то что в базе с тем что на диске?
Или достаточно убить все записи и создать снова?
Убить и создать снова.

HandKot Pantalone Я пользуюсь рекордсетом только потому что мне нужно получить ID добавляемой записи

ID- можно формировать в басикеи заносить уже с готовым ID, тогда и не будет проблем с вложенным рекордсетом
Спасибо, попробую.
...
Рейтинг: 0 / 0
Как правильно работать с ADO рекордсетом в рекурсиях?
    #33355531
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще мысль есть, если уж формировать ID без счетчика самому, а записи только добавлять, то не сделать ли это по схеме: все данные по рекурси в массив запихать, а уже по окончании прохода всех рекурсий все это скинуть в базу, по идее скорость быстрее будет в разы, а?
...
Рейтинг: 0 / 0
Как правильно работать с ADO рекордсетом в рекурсиях?
    #33355616
Letter_D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...Если у компьютера мозгов хватит под этот массив.
А если винды начнут этот массив сбрасывать в файл подкачки, то алес капут.
:((
...
Рейтинг: 0 / 0
Как правильно работать с ADO рекордсетом в рекурсиях?
    #33358954
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если планируется только добавлять данные в базу, каким образом это получится наиболее быстро?

Код: plaintext
1.
2.
3.
4.
5.
6.
Dim s As New Command
With s
.ActiveConnection = conn
.CommandType = adCmdText
.CommandText = "INSERT INTO TABLE(T1,T2,T3) VALUES('привет',150,'пока')"
.Execute
End With

или

Код: plaintext
1.
Dim cnnData As ADODB.Connection
cnnData.Execute "INSERT INTO TABLE(T1,T2,T3) VALUES('привет',150,'пока')"
...
Рейтинг: 0 / 0
Как правильно работать с ADO рекордсетом в рекурсиях?
    #33359086
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Быстрее всего получится так:
Код: plaintext
1.
2.
3.
Do '.....
   rs.AddNew Array(.,.,.,.),Array(.,.,.,.)
Loop
rs.UpdateBatch
...
Рейтинг: 0 / 0
Как правильно работать с ADO рекордсетом в рекурсиях?
    #33359092
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если использовать Command, то надо написать в mdb запрос на добавление и его исопльзовать как основу Command. Тогда быстрее будет.
...
Рейтинг: 0 / 0
Как правильно работать с ADO рекордсетом в рекурсиях?
    #33360060
AndreyF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PantaloneЕсть смысл использовать adLockBatchOptimistic-рекордсет.
Можно немного подробнее?

Кстати, рекордсет на уровне модуля объявить не получится, иначе функция выдает ошибку что он уже открыт, действительно он же открыт в предыдущем вызове функции по рекурсии, а последующие вызывы пытаются открыть его же, так что придется видимо в каждом вызове рекурсии. Придется в каждом вызове фенкции создавать свой рекордсет, а это тормоза...[/quot]

Вообще-то открыть его можно до первого вызова функции .
...
Рейтинг: 0 / 0
Как правильно работать с ADO рекордсетом в рекурсиях?
    #33360101
AndreyF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PantaloneЯ пользуюсь рекордсетом только потому что мне нужно получить ID добавляемой записи.

Можно создать свою процедуру, на добавление одним из параметром (OUTPUT) которой будет новая ID-шка.

Ну или так:

Код: plaintext
1.
2.
Set r = cn.Execute("INSERT INTO ...." & vbCrLf _
                        & "SELECT SCOPE_IDENTITY() AS NewID")

Тогда в r(0) и будет новая ID_Шка...

Но с процедурой в данном случае все-же лучше...
...
Рейтинг: 0 / 0
Как правильно работать с ADO рекордсетом в рекурсиях?
    #33360145
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreyF
Вообще-то открыть его можно до первого вызова функции .
Уже попробовал, все равно медленно все это.
...
Рейтинг: 0 / 0
Как правильно работать с ADO рекордсетом в рекурсиях?
    #33360327
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Открыть до первого вызова
2. Открыть как BatchOptimistic
3. Не выполнять UpdtaBatch до завершения сканирования файловой системы.
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как правильно работать с ADO рекордсетом в рекурсиях?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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