Ценю Ваше время, и буду очень признателен если кто-нибудь из профессионалов даст совет.
Моя программа на VB работает с удаленной базой данных MySQL через MyODBC драйвер, в VB работаю через ADOшное подключение.
В целом все работает, но т.к. база удаленная очень мучает скорость работы. Оптимизировал все запросы на более сложные, чтобы получать все требуемое одним запросом, многое ускорил, но основная проблема осталась:
Когда получаю список и его необходимо обработать полностью - шагаю по нему через MoveNext. Проблема заключается в том, что каждый MoveNext фактически "дергает" удаленную базу данных, и соответственно каждая итерация при удаленной работе создает очень большую задержку, а т.к. списки не маленькие - получение информации очень тормозит работу.
Есть ли возможность получить как бы Snapshot этого рекордсета, т.е. сразу полностью его весь выкачать и затем в циклах обработки работать уже с локальными данными?
Возился с курсорами, параметрами соединения, мне кажется все перебрал - результат один и тот же.
Есть, на мой взгляд бредовая, идея - получить результат этого запроса единым блоком, объеденив все ряды через CONCAT, затем в программе пропарсить и разделить ряды - но это Криво...
Может есть у кого какие-нибудь мысли на этот счет?
Как можно получить сразу все данные?
Пример получения/Обработки данных
- Код: Выделить всё
Dim rs As ADODB.Recordset
mysql.SelectQuery "SELECT `service_table`.*, DATE_FORMAT(`datetime`, '%d.%m.%Y' ) as `date`, `users`.`name` AS `opername` FROM `service_table` LEFT JOIN `users` ON `service_table`.`person` = `users`.`id` WHERE `automat` = '" & CStr(selaut) & "' ORDER BY `datetime` DESC, `id` DESC LIMIT 30;", rs
(...Проверка на правильность открытия...)
rs.MoveFirst
Do While Not rs.EOF
If IsInitiated = False Then DoEvents
If r >= FGrid.rows Then FGrid.rows = FGrid.rows + 1
(...заносим данны в Грид и прочее...)
FGrid.TextMatrix(r, 1) = CStr(rs("date"))
FGrid.TextMatrix(r, 2) = CStr(rs("gs_count"))
FGrid.TextMatrix(r, 3) = fbalance(rs("gs_total")
r = r + 1
rs.MoveNext
Loop
(...Закрываем рекордсет...)
В модуле работы с базой
Коннекшен открываем так
With ADO_Connect
.mode = adModeReadWrite
.ConnectionString = "DRIVER={MySQL ODBC 5.1 Driver};SERVER=XX.XX.XX.XX;PORT=3306;DATABASE=XXXXXX;USER=XXX;PASSWORD=XXX;OPTION=3;"
.Open 'mMain.DSNConnection
End With
Рекордсет открываем с такими параметрами по умолчанию
With ADO_Recordset
Set .ActiveConnection = ADO_Connect
.CursorLocation = adUseClient
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Source = sql
.Open
End With