Асинхронный запрос

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Асинхронный запрос

Сообщение VVitafresh » 02.03.2006 (Чт) 18:13

Запускаю запрос:
Код: Выделить всё
Public WithEvents rsSybr As ADODB.Recordset

Public Sub Select
     rsSybr.Open SQL, cn, adOpenStatic, adLockReadOnly, adAsyncFetch
End Sub

Private Sub rsSybr_FetchProgress(ByVal Progress As Long, ByVal MaxProgress As Long, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
    Me.lblCount.Caption = rsSybr.RecordCount
End Sub

По идее ведь прогрмма должна "жить", на самом деле она замирает (Not responding) и висит так пока запрос не выполнится (минут 5), после чего вываливает данные в датагрид.
В чем может быть проблема? Может не все БД поддерживают асинхронные запросы (делаю запрос к Sybase ASE)?
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 02.03.2006 (Чт) 18:20

sybase поддерживает, просто у тебя вызов не совсем верный.

adAsyncFetchNonBlocking надо, чтобы грид не застывал

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 02.03.2006 (Чт) 18:56

Плюс к этому, RecordCount лучше не трогать.
Если тебе прогрессбар нужен, то есть MaxProgress.
Lasciate ogni speranza, voi ch'entrate.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 02.03.2006 (Чт) 22:16

Опять-таки, adAsyncFetch дает тебе асинхронность только для вытяжки данных, но не для всей работы запроса. Может, он там у тебя эти 5 минут математику крутит, а потом за полсекунды возвращает на клиента несколько строк.

adAsyncExecute пробовал?

ЗЫ Это читал?
ЗЗЫ А это? Понимаю, что не совсем твой случай, но все-таки CursorType проверь...

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 03.03.2006 (Пт) 13:35

Почитал ответы, всем спасибо за участие!
Но я забыл сразу уточнить, что запрос у меня -- это вызов хранимой процедуры, возвращающей рекордсет. Поэтому мне подошел вариан, предложенный Ennor:
Код: Выделить всё
Public WithEvents cnn As ADODB.Connection

rsSybr.Open SQL, cnn, adOpenStatic, adLockReadOnly, adAsyncExecute

Private Sub cnn_ExecuteComplete(ByVal RecordsAffected As Long, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pCommand As ADODB.Command, ByVal pRecordset As ADODB.Recordset, ByVal pConnection As ADODB.Connection)
    Me.lblCount.Caption = RecordsAffected 'Только кол-во записей не показывает почему-то
End Sub

А вот такой вариант не катит (программа висит до конца запроса):
Код: Выделить всё
rsSybr.CursorLocation = adUseClient
rsSybr.Properties("Initial Fetch Size") = 0
rsSybr.Properties("Background Fetch Size") = 1

rsSybr.Open SQL, cn, adOpenStatic, adLockReadOnly, adAsyncFetchNonBlocking
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 03.03.2006 (Пт) 14:10

вот так надо:

Код: Выделить всё
    Set rsSMS = New ADODB.Recordset
    rsSMS.CursorLocation = adUseClient
    rsSMS.PageSize = 100
    rsSMS.CacheSize = 1000
    Set rsSMS.ActiveConnection = cn
    rsSMS.Open SQL, , adOpenStatic, adLockReadOnly, adAsyncFetchNonBlocking

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 03.03.2006 (Пт) 15:29

Konst_One, так я тоже пробовал по твоему примеру.
Проблема, наверное, в том что у меня ХП "5 минут математику крутит" (как выразился Ennor), а результат в рекордсет выдает довольно быстро.
ИМХО
adAsyncFetchNonBlocking
ждет пока не возвратится хотя бы одна запись и только тогда создает отдельный асинхронный поток и установка свойства:
Код: Выделить всё
rst.Properties("Initial Fetch Size") = 0
почему-то не помогает исправить ситуацию.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 03.03.2006 (Пт) 15:49

попробуй свою ХП выполнить в QA (в самой базе) и посмотри за какое время она выполняется.

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 03.03.2006 (Пт) 16:22

Konst_One писал(а):попробуй свою ХП выполнить в QA (в самой базе) и посмотри за какое время она выполняется.

QA в Sybase нет, зато есть SQL Advantage. Он при вызове ХП задумывается на те же ~5 минут, после чего выдает ~1000 записей результата. Так что конкретно в моем случае adAsyncExecute, наверное, более предпочтительный вариант. Даже события таймера отрабатывают (для создания иллюзии поиска изменением прогрессбара).
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList  
cron