powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
27 сообщений из 27, показаны все 2 страниц
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
    #32454916
DimVB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не могу понять... Столкнулся с задачей, во время выполнения вызова хранимки на MS SQL 2000 через ADODB.Command программа блокируется на время выполнения. Для решения этой проблемы решил воспользоваться потоками. Те запускать обращения к базе в отдельном потоке.
Во первых, прочел статьи по поводу многопотоковости. Например, http://www.vbnet.ru/article/showarticle.asp?id=20
Скачал известный пример Philipp Weidmann с использованием класса clsThreading.cls.
Но во-первых проект приходится компилировать в P-code (посмотрел в примере Philipp Weidmann) иначе ругается msvbvm60.dll -те виртуальная машина. А компилировать в P-code не хочется.
Так вот случае,если в нити происходит вызов хранимки через ADODB.Command все вылетает с ошибкой,даже если откомпилировать в P-code. Я не понимаю,потому что явно чего то не знаю.Почитав по форумав, понял что с потоками вообще очень даже не просто в VB.

Может кто-нибудь объянит в чем тут дело?? Или как решить эту проблему, желательно с примером?
...
Рейтинг: 0 / 0
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
    #32455005
KostyaSPB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если выполнять СОММАНД асинхронно?
Не подойдет?
...
Рейтинг: 0 / 0
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
    #32455307
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Верно. Здесь нужно асинхронное выполнение,

добавь в опиции рекордсета adAsyncExecute.

Когда он отработает будет вызванособытие ExecuteComplete, в нем и лови.


Magnus
...
Рейтинг: 0 / 0
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
    #32455335
Processor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Моё исследование взаимодействия свойств, методов объектов ADO и порождаемых ими событий позволило выстроить следующую причинно-следственную цепочку.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
 1 .	Запускается процесс асинхронного открытия рекордсета, 
    возвращающего результат выполнения хранимой процедуры:
    Set rs = cmd.Execute(, , adCmdStoredProc + adAsyncFetch + adAsyncFetchNonBlocking 
                                  + adAsyncExecute)
 2 .	Обработчик события ExecuteComplete объекта ADODB.Connection 
    поставляет состояние запрашиваемого в п.  1  рекордсета:
    If .State = ObjectStateEnum.adStateClosed Then
	    хранимая процедура вернула  0  записей.
	    Отрицательный результат -знaчимый результат:
	    возбуждаем событие RsDone, связанное (уже нами, а не Microsoft'ом)
	    с рекордсетом rs: рекордсета нет (Nothing, иными словами), 
	    а событие есть и работает!
    Else
	   .CacheSize = .RecordCount
	   устраняем необходимость обработки события FetchProgress: 
	   программируем обмен не по одной записи, 
	   а пакетом из .RecordCount записей.
    End If
 3 .	Обработчик события FetchComplete не-Nothing (.RecordCount> 0 ) рекордсета 
    возбуждает событие RsDone и отключает рекордсет от сервера:
    все данные находятся на стороне клиента . 
 4 .	Для распознавания состояния  "Рекордсет отфильтрован"  используем событие MoveComplete. 
    Оно возбуждается в  15  ситуациях, индицируемых переменной adReason. 
    Изо всех  "резонов"  (причин) единственный - adRsnRequery - сопутствует фильтрации. 
    В ADO Help даётся следующая расшифровка:
	adRsnRequery а  7  а An operation requeried the Recordset. 
    (пойди, догадайся, что этот комментарий указывает на фильтрацию).
    Его и используем для возбуждения события RsDone.
 5 .	Сведя все прерывания (события), связанные с заполнением рекордсета 
    (пустой, первичный или фильтрованный), в единое RsDone, можно программировать его обработчик.
    Всё остальное - программирование типа CommandButton1_Click()...
...
Рейтинг: 0 / 0
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
    #32456730
DimVB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо всем,особенно Processor за столь назвернутый ответ. Сделал в соответствии с твоим предложением, в IDE вроде бы все в порядке,а вот в exe когда запрос должен вернуть 180000 записей... в какой то момент все-таки на время подвисает (Not responding) %((( может я что то еще забыл???



Сделал следующий класс
Option Explicit
'Класс для инициализации коннекта
Private WithEvents con As ADODB.Connection
Private cmdrs As ADODB.Command
Private prmrs As ADODB.Parameter
Public WithEvents RsRezult As ADODB.Recordset
'
.............

'Событие - выролнение окончено %)
Event RsDone()

...........
'
Private Sub Class_Initialize()
Set con = New ADODB.Connection
Set cmdrs = New ADODB.Command
m_RezultIsEmpty = False
End Sub
'
Private Sub Class_Terminate()
Set con = Nothing
Set cmdrs = Nothing
Set prmrs = Nothing
Set RsRezult = Nothing
End Sub


'Выполнение функции и возвращение результата в виде рекордсета
'CSEH: MyErrMsgBox
Public Function Execute(Optional ByVal comtimeout As Integer = 30) As Boolean
'
'<EhHeader>
On Error GoTo Execute_Err
'</EhHeader>
OpenConnect

With cmdrs
.CommandText = Me.CommandText
.CommandTimeout = comtimeout
'
Set .ActiveConnection = con
'Запускается процесс асинхронного открытия рекордсета
Set RsRezult = .Execute(, , adCmdStoredProc + adAsyncFetch + adAsyncFetchNonBlocking _
+ adAsyncExecute)
End With

'<EhFooter>
Execute_Exit:
Exit Function

Execute_Err:
Screen.MousePointer = 0
If MyErrorMessage(Err.Number, Err.Description, "FirmBaseClient.SqlConnection.Execute", comtimeout) = False Then
MsgBox "Ошибка в FirmBaseClient.SqlConnection.Execute " & Err.Description & _
vbCrLf & " N:" & Err.Number
End If
Resume Execute_Exit
'</EhFooter>
End Function

'Открываем коннект
Private Sub OpenConnect()
With con
.CursorLocation = Me.CursorLocation
.Open Me.ConnectionString
End With
End Sub

'Обработчик события ExecuteComplete объекта ADODB.Connection
' поставляет состояние запрашиваемого рекордсета
Private Sub con_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)

With RsRezult
If .State = ObjectStateEnum.adStateClosed Then
'хранимая процедура вернула 0 записей.возбуждаем событие RsDone
Me.RezultIsEmpty = True
RaiseEvent RsDone
Else
If .RecordCount = 0 Then
'Вернулось 0 записей
Me.RezultIsEmpty = True
RaiseEvent RsDone
Else
.CacheSize = .RecordCount
'устраняем необходимость обработки события FetchProgress:
'программируем обмен не по одной записи,а пакетом из .RecordCount записей.
End If
End If
End With

End Sub

'Обработчик события FetchComplete не-Nothing (.RecordCount>0) рекордсета
'возбуждает событие RsDone и отключает рекордсет от сервера:
'все данные находятся на стороне клиента .
Private Sub RsRezult_FetchComplete(ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
With RsRezult
If .RecordCount > 0 Then
Set .ActiveConnection = Nothing
RaiseEvent RsDone
End If
End With
End Sub

'Для распознавания состояния "Рекордсет отфильтрован" используем событие MoveComplete.
'Оно возбуждается в 15 ситуациях, индицируемых переменной adReason.
'Изо всех "резонов" (причин) единственный - adRsnRequery - сопутствует фильтрации.
'Его и используем для возбуждения события RsDone
Private Sub RsRezult_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
If adReason = adRsnRequery Then
RaiseEvent RsDone
End If
End Sub

А вот сам вызов:

Set asynccon = New SqlConnAsync
With asynccon
.CursorLocation = clUseClient
.ConnectionString = MyConnectionString
.CommandType = adCmdStoredProc
.CommandText = "My_SearchRezultGetBySQl"
'
'Debug.Print msql
.AddParameter "@sql", ptNtext, adParamInput, msql, 107374182
'
.Execute 90
End With


Что я еще забыл??? почему все-таки иногда блокируется прога?


Кроме того, кто-нибудь все-таки может внести хоть немного ясности про потоки в VB,почему надо компилировать в P-code? А в других режимах не хочет работать и почему у меня все вылетало? Это я про свою первую реализацию
...
Рейтинг: 0 / 0
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
    #32456978
Processor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приведенное мною описание причинно-следственных связей на скорую руку скопировано из внутреннего отчёта, поэтому детали контекста не видны.
.CacheSize = .RecordCount как раз и продиктовано тем, что ХП возвращает выборку длиной максимум 200-300 записей (подмножество наименований контрагентов, выбранных по трёхсимвольной маске).
В твоей задаче количество возвращаемых записей существено больше.
Так и организуй фетчинг: он обеспечит тебя данными для построения прогресс-бара (это не главное) и анализа состояния коннекта после передачи каждой порции!

Не скрою, процесс отладки асинхронки занял продолжительное время.
Накидай все возможные обработчики, "подкрась" их активацию (типа Debug.Print) и анализируй, что необходимо, что достаточно, что избыточно.
...
Рейтинг: 0 / 0
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
    #32457140
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
/topic/67542&hl=terminatethread
...
Рейтинг: 0 / 0
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
    #32458126
DimVB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что касается ссылки на многопотоковость,то там ничего интересного нет. Про то что поток лучше не убивать я уже много где прочел,а вот объяснения про P-code и других ответов нет.Но все равно спасибо

Теперь вопрос про adAsyncFetch - Indicates that the remaining rows after the initial quantity specified in the CacheSize property should be fetched asynchronously.
По умолчанию CacheSize=1, те как я понимаю .Execute(, , adCmdStoredProc + adAsyncFetch + adAsyncFetchNonBlocking + adAsyncExecute)

Означает,что выполнение асинхронное и если данные превышают CacheSize(а он по умолчанию 1),то возвращаются асинхронно - порциями, ну и кроме того поток не блокируется - adAsyncFetchNonBlocking.

По Debug в Private Sub RsRezult_FetchProgress(ByVal Progress As Long, ByVal MaxProgress As Long, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
Debug.Print "Progress: " & Progress & " MaxProgress: " & MaxProgress
End Sub

У меня возвращаетяс что типа
Progress: 20060 MaxProgress: 20075
Progress: 20075 MaxProgress: 20090
....

Вопрос, как я понимаю данные возвращеются порциями по 15 записей??? А как сделать больше порцию??? Кроме того для создания processbar - как узнать сколько вообще должно вернутся записей,потому что MaxProgress - возвращает ожидаемое количество, а при обращении к .recordcount рекордсета - он разумеется запрашивает все оставшиеся записи.

В примере:
2. Обработчик события ExecuteComplete объекта ADODB.Connection
поставляет состояние запрашиваемого в п. 1 рекордсета:
If .State = ObjectStateEnum.adStateClosed Then
хранимая процедура вернула 0 записей.
Отрицательный результат -знaчимый результат:
возбуждаем событие RsDone, связанное (уже нами, а не Microsoft'ом)
с рекордсетом rs: рекордсета нет (Nothing, иными словами),
а событие есть и работает!
Else
.CacheSize = .RecordCount
устраняем необходимость обработки события FetchProgress:
программируем обмен не по одной записи,
а пакетом из .RecordCount записей.
End If

запросив .RecordCount мы сразу вернули все записи, но мне все-таки не очень понятна работа с .CacheSize,кроме того это условие срабатывает при .State =9??? Что это за состояние рекордсета? Вроде как возвращаемая порция должна регулироваться .CacheSize,но как??? те как мне этим управлять?

Вот что написано
Use the CacheSize property to control how many records the provider keeps in its buffer and how many to retrieve at one time into local memory. For example, if the CacheSize is 10, after first opening the Recordset object, the provider retrieves the first 10 records into local memory. As you move through the Recordset object, the provider returns the data from the local memory buffer. As soon as you move past the last record in the cache, the provider retrieves the next 10 records from the data source into the cache.

те как я понимаю именно в случае adAsyncFetch - сервер отдает именно порциями указаными в CacheSize? Я точно недопонимаю.
...
Рейтинг: 0 / 0
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
    #32458183
Processor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimVB сервер отдает именно порциями указаными в CacheSize?
Как только сервер закончил выполнение ХП, он "имеет что сказать за выполнение команды (и за рекордсет в частности)" и возбуждает событие ExecuteComplete.
Параметры, передаваемые им в обработчик, тебе доступны для анализа и только потом - для изменения свойств объекта-параметра: ведь объект может быть Nothing!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
Private Sub cnE_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)
'The ExecuteComplete event is called after a command has finished executing.
'Debug.Print  "ExecuteComplete" 
On Error GoTo ErrHandler
DoEvents
If Not (pError Is Nothing) Then
    If pError.Number <>  0  Then
        Dim s As String
        s = pError.Number & Comma & pError.Description & Comma & pError.Source & vbCrLf '
        Dim sErr As Error
        For Each sErr In pConnection.Errors
            s = s & sErr.Number & Comma & sErr.Source & Comma & sErr.Description & vbCrLf
        Next sErr
        Err.Clear
'установка признаков....

    End If
Else
    With pRecordset
        If .State = ObjectStateEnum.adStateClosed Then
                rsOrgOK = True
                rsOrgRows =  0 : rsMaxRows =  0 
                RaiseEvent RsDone(rsOrgRows, FP.OldGoal)
        Else
'**********************************************************
' Вот то место, где ты должен вычислить объём порции обмена и задать его:
                .CacheSize = .RecordCount 
'               .......
        End If
    End With
End If
Exit Sub
ErrHandler:
MsgBox  Err.Source & vbCr & Err.Number & vbCr & Err.Description, _
vbInformation + vbOKOnly,  "DisConnRS.cnE_ExecuteComplete:" 
Err.Clear

End Sub
...
Рейтинг: 0 / 0
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
    #32458193
Processor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вдогонку:
Асинхронные запросы отлаживай на автономном от сервера компьютере,
а лучше - компьютерах.
Увы, это нелёгкий путь...
...
Рейтинг: 0 / 0
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
    #32458266
DimVB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Про нелегкий путь спасибо %)) Но я вижу,что ты очень хорошо разобрался в этом вопросе %)))

Да,теперь становится яснее про ExecuteComplete (это было на поверхности,но мысль никак не могла сформироваться %)) ),но тут у меня тогда другой вопрос, ну во первых как все-таки узнать количество найденных записей???
RecordsAffected возвращает мне -1 %((( запросить .recocrdcount я не могу.
Кроме того,даже если я выставляю например

'**********************************************************
' Вот то место, где ты должен вычислить объём порции обмена и задать его:
.CacheSize = 77
' .......
End If


По Debug в RsRezult_FetchProgress все равно
.............
Progress: 182840 MaxProgress: 182855 CacheSize: 77
Progress: 182855 MaxProgress: 182870 CacheSize: 77
.............

те мне возвращают по 15 записей. ???

Правильно ли я понимаю,что когда произошло ExecuteComplete на стороне клиента еще нет никаких данных??? те нет рекордсета, поэтому когда говорим .CacheSize = .RecordCount, то как раз таки запрашиваем,те получаем весь рекордсет на сторону клиента!? Вот тут то и происходит зависание??

Кстати, не будет ли быстрее реализовать этот класс в отдельной dll с асинхронным вызовом,чтобы не тратить время на фетчинг??? те если мне не нужен процессбар? Ведь dll будет выполняться в отдельном процессе и соотвественно не подвесит программу. Мне просто интересно ты хоть приблизительно для себя определял на сколько медленее все работает с фетчингом
...
Рейтинг: 0 / 0
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
    #32458408
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
         rst.Properties( "Initial Fetch Size" ) = ...
         rst.Properties( "Background Fetch Size" ) = ...


Initial Fetch Size determines how many records are fetched synchronously before
the asynchronous thread is created. This allows for a small recordset to be
created without the additional overhead of creating a thread. This is set to 50 by
default. To guarantee that FetchProgress and FetchComplete are called, set this
value to 0.

Background Fetch Size determines how many records are fetched between calls to
the FetchProgress event. This is set to 15 by default.
...
Рейтинг: 0 / 0
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
    #32458537
Processor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Коллеги как-то робко намекали про контролы: нет ли у тебя контролов типа ADOData и т.п. Ты не ответил. Возможно, между твоим кодом и сервером есть нечто ещё, маскирующее некоторые события.
Чтобы быстрее вникнуть в "что, где, когда", выхолости задачу до безобразия:
оставь только вызов ХП с небольшим объёмом возвращаемых записей. Идеально - если это БД Northwind: она доступна всем. А затем усложняй задачу.
2. DimVB как все-таки узнать количество найденных записей???
RecordsAffected возвращает мне -1 %((( запросить .recocrdcount я не могуRecordsAffected As Long, pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, pCommand As ADODB.Command, pRecordset As ADODB.Recordset, pConnection As ADODB.Connection
Зачем так много всякого?
Для того, чтобы понять, почему "RecordsAffected возвращает мне -1", а поток данных всё же передаётся.
...
Рейтинг: 0 / 0
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
    #32458569
DimVB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
         rst.Properties( "Initial Fetch Size" ) = ...
         rst.Properties( "Background Fetch Size" ) = ...


При попытке установить в ExecuteComplete - ругается что данное свойство read-only %((

К тому же,я так и не понял - почему при вызове .CacheSize = .RecordCount
может подвисать??? потому что в этот момент мы запрашиваем ВЕСЬ рекордсет с сервера??? или нет??? до этого момента на стороне клиента есть что-нибудь?

И если мы напишем .CacheSize = .RecordCount в ExecuteComplete - почему не вызывается FetchProgress или вызывается но мало раз?? те тогда уже не надо устанавливать "Background Fetch Size"? и по сути,я так понимаю - смысл этого "Background Fetch Size" только в том,чтобы вызывать FetchProgress?

Прошу прощения, но я просто не заметил нигде намека на вопрос о контролах %))) Нет,их нет. Все раелизованно через класс,которые здесь же я и приводил
...
Рейтинг: 0 / 0
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
    #32458594
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При попытке установить в ExecuteComplete - ругается что данное свойство read-only %((

а зачем в ExecuteComplete? Надо перед Set RsRezult = .Execute....
...
Рейтинг: 0 / 0
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
    #32458656
DimVB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, это я уже посмотрел, что надо до вызова,но тогда (см. пример моего класса выше) надо давать Set RsRezult.ActiveConnection = con, а у меня сразу
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
  With cmdrs
   .CommandText = Me.CommandText
   .CommandType = Me.CommandType
   .CommandTimeout = comtimeout
   '
   Set .ActiveConnection = con
   'Запускается процесс асинхронного открытия рекордсета
   Set RSrezult = .Execute(, , adCmdStoredProc + adAsyncFetch + adAsyncFetchNonBlocking _
                                  + adAsyncExecute)
  End With



те вставив
Set RSrezult = New ADODB.Recordset
Set RSrezult.ActiveConnection = con
RSrezult.Properties("Background Fetch Size") = 77
перед .Execute(, , adCmdStoredProc + adAsyncFetch + adAsyncFetchNonBlocking + adAsyncExecute)

И кроме того,даже после это посмотрев в debug

Код: plaintext
1.
2.
3.
Private Sub RsRezult_FetchProgress(ByVal Progress As Long, ByVal MaxProgress As Long, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
   Debug.Print  "Progress: "  & Progress &  " MaxProgress: "  & MaxProgress   
End Sub


Получил следующее

Progress: 182810 MaxProgress: 182825
Progress: 182825 MaxProgress: 182840

те все равно 15,Но я думаю что все дело еще в том,что я использую cmdrs As ADODB.Command ??? В смысле из-за этого игнорируется RSrezult.Properties("Background Fetch Size") = 77??

Processor предлагает вычислить размер порции в ExecuteComplete!!! %))) а как там установить это совйство,если он уже read-only? Я видимо совсем плох,потому как не совсем понимаю %)))
...
Рейтинг: 0 / 0
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
    #32458763
Processor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Все и немедленно" - стиль, насаждаемый Jeans для выкачивания денег.
"Поспешай медленно" - опыт прошлых поколений, но не устаревший.
"Я видимо совсем плох,потому как не совсем понимаю %)))" - это близко к панике.
Сядь, подумай, не гони волну!
...
Рейтинг: 0 / 0
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
    #32458826
DimVB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за совет %))) Я совсем не близок к панике. Да и действительно хочется разобраться, но сроки поджимают,скоро сдача проекта, а эта часть сам понимаешь не последняя %))) Вопрос о выполнении в фоновом режиме запроса встал передо мной в понедельник - сейчас пятница %))) решение конечно мне подсказали - за что всем ответившим огромное спасибо (особенно Processor), но оно еще не идеально. Да уже сейчас у меня работает - те у пользвателя на экране что то крутится,а в это время выполняется запрос и не блокирует программу, но вот вопрос с размером порций не решен...буду думать... но фактор времени....
...
Рейтинг: 0 / 0
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
    #32458847
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема возможно как раз в работе через Command.
Попробуй без нее. Просто rs.Open со всеми параметрами в options.

На счет библиотеки. В принципе будет та же бодяга. Там тебе придется организовать колбек для получения данных. И что нам это даст? А даст маршалинг рекордсета через границы процесса. Не самая быстрая операция. Так что ИМХО лучше уж внутри.


Magnus
...
Рейтинг: 0 / 0
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
    #32458886
Processor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну убейте меня, не поверю я, что юзеру удобно будет ползать по гриду в 20 000 строк!
Так зачем их качать на клиента?
...
Рейтинг: 0 / 0
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
    #32458922
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В некоторых случаях бывает удобно :)
Мы же пока что во внутреннстях колупаемся и саму задачу не знаем.
Задачи разные нужны, задачи разные важны :)


Magnus
...
Рейтинг: 0 / 0
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
    #32458982
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу размера порций... перед открытием ставь rs.PageSize = кол-во записей...
...
Рейтинг: 0 / 0
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
    #32459002
DimVB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Про разные и важные задачи спасибо %)))
речь идет о поисковой адресной базе - сейчас она уже перевалила за 200тыс. необходим отбор достаточно большого количества данных на сторону клиента (ну просто нужно %)) ) Я уже реализовал мастер запросов - это его выполнение.

Сейчас смотрю debug FetchProgress и такое ощещение что туплю %))
Вот что он мне пишет по поводу возвращения 150 строк

Progress: 140 MaxProgress: 155 Как я понимаю осталось передать в рекордсет 140 записей
Progress: 125 MaxProgress: 140 Как я понимаю осталось передать в рекордсет 125 записей и тд

Progress: 110 MaxProgress: 125
Progress: 95 MaxProgress: 110
Progress: 80 MaxProgress: 95
Progress: 65 MaxProgress: 80

На последнем этапе осталось 50,а тут уже срабатывает "Initial Fetch Size"=50
Но тут мне опять же не совсем понятно, почему при том что должно вернуться 150 строк,первая в дебаге 155???

Вызывается событие ExecuteComplete. И к этому моменту как я понимаю в рекордсете все данные??? Правильно? Потому уже срабатывает FetchComplete и снова FetchProgress. Так зачем мне вообще кидать .cachesize что-либо???

Для увеличения скорости работы с рекордсетом??
...
Рейтинг: 0 / 0
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
    #32459035
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забей на MaxProgress -

A Long value indicating the maximum number of records expected to be retrieved.

Кроме того оно приблизительное.
...
Рейтинг: 0 / 0
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
    #32459095
Processor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ExecuteComplete на сервере.
Отработала команда и выдаёт статус завершения.
Ты должен принять решение - какая команда, завершилась ли и как завершилась.
Для извлечения семантики тебе передаются скаляры и указатели на объекты.
Зная контекст запроса, ты выбираешь тот или иной объект и анализируешь те или другие его свойства.
В зависимости от ВОЗМОЖНЫХ значений свойств направляешь в то или иное русло ход программы.
А что именно заложено в мнемонику значения св-ва, не всегда ясно.

Мне не удалось найти временную диаграмму последовательности возникновения событий: её, наверное, нет в природе. Поэтому приходится, как тебе, продираться через дебри, но это не значит, что в следующей задаче всё пойдёт как по маслу.
...
Рейтинг: 0 / 0
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
    #32459132
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 DimVB:
Вопрос возник. Когда-то давно у меня была похожая задача - нужно было по-любому выдавать юзеру огромный рекордсет. Я тоже попробовал было использовать асинхронную выборку, но твоими проблемами не заморачивался:), у меня другая была. Выборка отображалась в гриде (TrueDBGrid), с первым куском проблем не было, а вот дальше... Нужно же добавлять новые куски, а грид намертво привязан к рекордсету, и каждый раз при добавлении нового куска он то перерисовывался, то перезаполнялся, то просто скакал по записям, в общем и прога тормозила, и пользоваться было неудобно.
Вопрос, собственно: грузишь ли ты свой рекордсет просто в память или выдаешь куда-нибудь на монитор? И если да, то как решаешь описанную проблему?
...
Рейтинг: 0 / 0
Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
    #32460789
DimVB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну,во-первых всем огромное спасибо %))) Сегодня у меня все заработало как надо,те я вроде доволен. Да,пришлось отказатся от Command и сделать через recordset, чтобы работать с
.Properties("Initial Fetch Size") = 0
.Properties("Background Fetch Size") = Me.FetchSize

Во-вторых,2 Antonariy :
Я не заморачиваюсь, те когда все данные в рекордсете на стороне клиента, то я передаю его в GridEx 2000 от janus - отличная вещь,очень продуманный и функциональный контрол,а он уже сам отрисовывает.
...
Рейтинг: 0 / 0
27 сообщений из 27, показаны все 2 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Помогите... Выполнение запроса к базе в фоновом режиме с помощью CreateThread
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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