powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Adodb.connection and multithreading
30 сообщений из 30, показаны все 2 страниц
Adodb.connection and multithreading
    #33862839
Slice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!!!! Вопрос у меня скорее всего не самый сложный но разобраться я не могу сам. Да и опят небольшой. а задача значит такая - НУжно прогу написать, которая обращается на сервак с процедурой и желательно это сделать с потоком. Отдельно обращение к процедуре на серваке все работает. А если я вставляю эту функцию в поток, то выделяется строка собъявдлением объекта ( Set cn=CreateObject ("Adodb.Connection") И надпись Automation Error. ПОмогите плиз!!!
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33862935
Настенька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может, надо так объявлять

dim cn as new adodb.connection
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33862946
Slice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я пытался и через объекты и через NEW Adodb.Connection
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33863032
Slice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А тектс программы таков:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Public Sub Doing()
Dim sql As String
 Dim result As ADODB.Recordset
 Dim cn As ADODB.Connection
 Set cn = CreateObject("ADODB.Connection")
 '   Set cn = New ADODB.Connection
    With cn
        .Provider = "SQLOLEDB"
        .CommandTimeout =  0 
        .Properties("User Id") = "***"
        .Properties("Password") = "***"
        .Properties("Data Source") = "***"
        .Properties("Persist Security Info") = True
        .Open
        .DefaultDatabase = "**"
    End With
  '  Dim result As ADODB.Recordset
  sql = "Select * from [send&rec]"
  Set result = CreateObject("ADODB.recordset")
 ' With result
  result.Open sql, cтn
Это в Модуле
и в форме:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Private Sub cmdStart_Click()

    Dim lpThreadID As Long
cmdClose.Visible = False
    lThreadHandle1 = CreateThread(ByVal  0 &, _
                ByVal  0 &, _
                AddressOf Doing, _
                ByVal  0 &,  0 , lpThreadID)
    lEventHandle = CreateEvent(ByVal  0 &, _
                False, False, ByVal  0 &)

End Sub
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33863591
TIKO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dim cn As Object
Set cn = CreateObject("ADODB.Connection")
или
dim cn as new adodb.connection
или
Dim cn As ADODB.Connection
set cn=new ADODB.Connection


Dim result As ADODB.Recordset
Set result = New ADODB.recordset
result.Open sql, cn

после всего этого
set cn=NOthing
set result=NOthing
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33863766
Slice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не помогло.....
во всех случаях выделяет строчку SETcn=.....
может там надо что-нть подключить (библиотеку например) или через класс модули??
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33863888
TIKO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
еще раз выложи код с исправлениями
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33863911
Slice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
Public Sub Doing()

Dim sql As String
 Dim result As ADODB.Recordset
 Dim con As Object
 Dim i As Long
 i =  0 
 Set con = CreateObject("ADODB.Connection")
 With con
        .Provider = "SQLOLEDB"
        .CommandTimeout =  0 
        .Properties("User Id") = "popkov"
        .Properties("Password") = "12589"
        .Properties("Data Source") = "KHD"
        .Properties("Persist Security Info") = True
        .Open
        .DefaultDatabase = "mg"
    End With
  Set result = New ADODB.Recordset
  sql = "Select * from [send&rec]"
  result.Open sql, con
  Set con = Nothing
Set result = Nothing
End Sub
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33863969
TIKO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dim con As Object
Dim rs As Object
Set con = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.RECORDSET")
con.Open "Provider=sqloledb;Data Source= ИМЯ_СЕРВЕРА ;Initial Catalog=KHD;User Id=popkov;Password=12589;"
rs.Open "select * from [send&rec]", con

Do Until rs.EOF
Debug.Print rs.fields(1).Value
rs.movenext
Loop

попробуй этот код
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33863981
TIKO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Dim con As Object
Dim rs As Object
Set con = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.RECORDSET")
con.Open "Provider=sqloledb;Data Source=KHD;Initial Catalog=mg;User Id=popkov;Password=12589;"
rs.Open "select * from [send&rec]", con

Do Until rs.EOF
Debug.Print rs.fields( 1 ).Value
rs.movenext
Loop
поправочка
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33864042
Slice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня не работает, опять выделяет туже самую строку.
У тебя такая запись с поток работает?
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33864065
TIKO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SliceУ меня не работает, опять выделяет туже самую строку.
У тебя такая запись с поток работает?


у мня свои параметры сервера и работает
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33864097
Alexey Kudinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SliceНУжно прогу написать, которая обращается на сервак с процедурой и желательно это сделать с потоком. А асинхронное получение данных не подойдет ?
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33864099
Slice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
значит делов не в этой функции. как у тебя это все выглядит? объявление потоков и вызов функции обращения к БД? ты используешь сласс модуль или просто модуль?
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33864115
Slice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
А асинхронное получение данных не подойдет ?


скорее всего нет, так как мне надо чтоб окно не "висло" во время выполнения запроса на серваке. Чтоб я его свернуть мог или перетащить
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33864133
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Варианты
1. - не делать так... adAsyncExecute в основном потоке...
2. - в каждом новом потоке перед соз-м COM вызывать CoInitialize
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33864161
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CoUninitialize - тоже можно :)
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33864308
Slice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TICO
у мня свои параметры сервера и работает


А можно как-нть увидить полный код твой проги :)
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33864384
TIKO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Slice TICO
у мня свои параметры сервера и работает


А можно как-нть увидить полный код твой проги :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Private Sub Command1_Click()
Dim con As Object
Dim rs As Object
Set con = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.RECORDSET")
con.Open "Provider=sqloledb;Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=;"
rs.Open "select * from jobs", con

Do Until rs.EOF
    Debug.Print rs.fields( 1 ).Value
rs.movenext
Loop


End Sub
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33864521
Slice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tico, ты видимо меня не понял.... А где потоки??? вот смотри у меня в модуле есть вот это :
Код: 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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
Option Explicit
Public Declare Function CreateThread Lib "kernel32" _
            (ByVal lpThreadAttributes As Any, _
            ByVal dwStackSize As Long, _
            ByVal lpStartAddress As Long, _
            lpParameter As Any, _
            ByVal dwCreationFlags As Long, _
            lpThreadID As Long) As Long

Public Declare Sub Sleep Lib "kernel32" _
            (ByVal dwMilliseconds As Long)

Public Declare Function TerminateThread Lib "kernel32" _
            (ByVal hThread As Long, _
            ByVal dwExitCode As Long) As Long

Public Declare Function TerminateProcess Lib "kernel32" _
            (ByVal hProcess As Long, _
            ByVal uExitCode As Long) As Long
Public Declare Function GetCurrentProcess Lib "kernel32" () As Long
Public Declare Function CreateEvent& Lib "kernel32" _
            Alias "CreateEventA" _
            (ByVal lpEventAttributes As Long, _
            ByVal bManualReset As Long, _
            ByVal bInitialState As Long, _
            ByVal lpname As String)
Public lThreadHandle1 As Long
'Public lThreadHandle2 As Long
Public lEventHandle As Long
Public Sub Doing()
Dim sql As String
 Dim result As Object
 Dim con As Object
 Dim i As Long
 i =  0 
 Set con = CreateObject("ADODB.Connection")
 With con
        .Provider = "SQLOLEDB"
        .CommandTimeout =  0 
        .Properties("User Id") = "***"
        .Properties("Password") = "***"
        .Properties("Data Source") = "***"
        .Properties("Persist Security Info") = True
        .Open
        .DefaultDatabase = "***"
    End With
  sql = "Select * from [send&rec]"
  Set result = CreateObject("ADODB.recordset")
  result.Open sql, con
  ' sql = "Select * from [Send&rec]"
If Not result.EOF Then
        result.MoveFirst
        While Not result.EOF
        i = i +  1 
frmOutput.txtResult = Str(i)
result.MoveNext
        Wend
       Else
       frmOutput.Shape1.FillColor = &HFF00&
End If
Set con = Nothing
Set result = Nothing
End Sub

Public Sub Main()
    frmOutput.Show
End Sub

А это в форме
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Private Sub cmdStart_Click()

    Dim lpThreadID As Long
cmdClose.Visible = False
    lThreadHandle1 = CreateThread(ByVal  0 &, _
                ByVal  0 &, _
                AddressOf Doing, _
                ByVal  0 &,  0 , lpThreadID)
    lEventHandle = CreateEvent(ByVal  0 &, _
                False, False, ByVal  0 &)

End Sub
Private Sub Form_Unload(Cancel As Integer)

    If lThreadHandle1 >  0  Then
        Call TerminateThread(lThreadHandle1, ByVal  0 &)
    End If

    Call TerminateProcess(GetCurrentProcess, ByVal  0 &)

End Sub
здеся че не так????
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33864579
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы можете выложить проект целиком?
Приведенный код у меня отваливается после первого же нажатия кнопки.
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33864608
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дохтор, меня все игнорируют... :)
А так?
Код: plaintext
1.
2.
3.
Declare Function CoInitialize Lib "ole32.dll" (ByVal _
	pvReserved As Long) As Long
Declare Sub CoUninitialize Lib "ole32.dll" ()

Код: 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.
Public Sub Doing()
Dim sql As String
 Dim result As Object
 Dim con As Object
 Dim i As Long
 i =  0 
Call CoInitialize( 0 )

 Set con = CreateObject("ADODB.Connection")
 With con
        .Provider = "SQLOLEDB"
        .CommandTimeout =  0 
        .Properties("User Id") = "***"
        .Properties("Password") = "***"
        .Properties("Data Source") = "***"
        .Properties("Persist Security Info") = True
        .Open
        .DefaultDatabase = "***"
    End With
  sql = "Select * from [send&rec]"
  Set result = CreateObject("ADODB.recordset")
  result.Open sql, con
  ' sql = "Select * from [Send&rec]"
If Not result.EOF Then
        result.MoveFirst
        While Not result.EOF
        i = i +  1 
frmOutput.txtResult = Str(i)
result.MoveNext
        Wend
       Else
       frmOutput.Shape1.FillColor = &HFF00&
End If
Set con = Nothing
Set result = Nothing
Call CoUninitialize 
End Sub
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33864709
Slice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
busera в ПРЕЗИДЕНТЫ!!!!!!!! ты просто ГУРУ программирования!!!!!!!! Красавчег пиши исче!!!! подскажи мне вот что, почему не работало и что делают эти процедурки из библиотеки ole32.dll????
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33864782
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я просто любопытен... :)
авторThis function initializes the COM library on the current thread and identifies the concurrency model as single-thread apartment (STA). Applications must initialize the COM library before they can call COM library functions other than CoGetMalloc and memory allocation functions.
Там их до икса... Поиск в гугле по Declare Function CoInitialize Lib "ole32.dll" первая ссылка...
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33864797
Slice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ок. Спасибо огромное всем, кто откликнулся на просьбу помощи. Отдельное спасибо buser
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33866315
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buserВарианты
1. - не делать так... adAsyncExecute в основном потоке...
2. - в каждом новом потоке перед соз-м COM вызывать CoInitialize

Какие преимущества многопоточности (CreateThread) перед асинхронным выполнением (adAsyncExecute) ?
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33867483
Slice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buser, у меня еще такой вопрос, даже не вопрос а ситуция. все работает в открытом VB, а када я создаюexeшник, то при закпуске оного вылезает ошибка, которая требует перезапустить exeшник. Компилировал с P-code.
и второй вопросик, что же такое adAsyncExecute? что эта команда делает? для чего она? желательно на какомнть понятном примере, а не так как в МСДН))
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33867602
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот что писал про adasyncexecute Processor
Остальные вопросы к buser остаются...
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33868216
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
marvanКакие преимущества многопоточности (CreateThread) перед асинхронным выполнением (adAsyncExecute) ?CreateThread это ты делаешь второй поток на клиенте. Главный поток продолжает заниматься отрисовкой картинок, получает события от клавиатуры-мышки. А второй поток запустил запрос в базу данных и ждет ответа от нее. Пока БД не ответит второй поток висит.

А если делаешь в одном своем потоке RecordSet.open с флагом adAsyncExecute, то open вернется сразу же, не ожидая ответа от БД. После этого ты должен сам в главном потоке опрашивать свой recordset "закончил ли он работу". И при этом не забывать ожидать событий от мышки и рисовать картинки на экране.
Фактически там все равно будет создан второй поток самим ADO, но он будет личным потоком драйвера ADO и ты до него доступа не имеешь.
...
Рейтинг: 0 / 0
Adodb.connection and multithreading
    #33868959
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owlесли делаешь в одном своем потоке RecordSet.open с флагом adAsyncExecute, то open вернется сразу же, не ожидая ответа от БД.
Спорное утверждение.
У меня событие ExecuteComplete происходит только после того, как процедура отработает. И ни кто не виснет и опрашивать ни кого не надо.
...
Рейтинг: 0 / 0
30 сообщений из 30, показаны все 2 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Adodb.connection and multithreading
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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