powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Можно ли в VBA передать объект ADODB в процедуру?
12 сообщений из 12, страница 1 из 1
Можно ли в VBA передать объект ADODB в процедуру?
    #35619473
LanSod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
В общем написал небольшой код для навигации по БД посредством ADODB. С целью придания читабельности, пытался передать в процедуру объект ADODB.Connection (Command, RecordSet) по ссылке (ByRef). В итоге в процедуру передалось только свойство ConnectingString объекта ADODB. В случае RecordSet в процедуру передается RecordSet.Fields.
Подскажите пожалуйста, можно ли в VBA передать объект ADODB в процедуру?
...
Рейтинг: 0 / 0
Можно ли в VBA передать объект ADODB в процедуру?
    #35619524
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Между разными приложениями (в т.ч. dll-ками) Connection не передастся. только строка подключения. А ByRef лучше не злоупотреблять. Если из вызываемой процедуры не должен возвратиться рекордсет или т.п., то ByVal
...
Рейтинг: 0 / 0
Можно ли в VBA передать объект ADODB в процедуру?
    #35619580
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WorobjoffМежду разными приложениями (в т.ч. dll-ками) Connection не передастся.Передается, но только в скомпилированном виде. Но с VBA видимо все равно не проканает.

LanSodВ случае RecordSet в процедуру передается RecordSet.FieldsА нужно указывать тип параметра. Fields — свойство по умолчанию, вот евойный объект и передается.
...
Рейтинг: 0 / 0
Можно ли в VBA передать объект ADODB в процедуру?
    #35619615
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Antonariy
> LanSod
> В случае RecordSet в процедуру передается RecordSet.Fields
> А нужно указывать тип параметра. Fields — свойство по умолчанию, вот евойный объект и передается.


+100

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Можно ли в VBA передать объект ADODB в процедуру?
    #35619704
LanSod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответы.
Хочу вынести из основного тела программы команды создания объектов Connection, Command, RecordSet, а также их закрытия, т.е. хочу получить что-то вроде:

myConnect(...) - Подключение к БД
...
Работа с БД - комманды Move, AddNew и т.д.
...
myClose (...) - Отключение от БД

Процедура myConnect должна возвращать созданный объект типа ADODB.Connection и полученный в соответствии с Сommand объект ADODB.RecordSet. Затем в основном теле программы полученный RecordSet обрабатывается (Move, AddNew и т.д.) и в myClose осуществляется закрытие переданных в процедуру объектов ADODB.Connection и ADODB.RecordSet.
Все данные операции выполняются в одном программном модуле Excel, т.е. передача между различными приложениями не планируется.

Пытался также явно указывать тип параметра, например:
Sub test(a As ADODB.Recordset)
a.MoveFirst
End Sub
Что приводит к ошибке 13 несовпадения типов.

Я тока недавно использую VBA, может что то напутал с типом параметров?
...
Рейтинг: 0 / 0
Можно ли в VBA передать объект ADODB в процедуру?
    #35619766
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Sub A(ByVal rs As ADODB.Recordset)
    rs.MoveFirst
End Sub

Sub B()
    Dim rs As New ADODB.Recordset
    Call rs.Fields.Append("id", adInteger)
    rs.Open
    rs.AddNew "id",  1 
    rs.AddNew "id",  2 
    Call A(rs)
End Sub
Работает...
...
Рейтинг: 0 / 0
Можно ли в VBA передать объект ADODB в процедуру?
    #35620148
LanSod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал так же у себя: в итоге ADODB.Connection и ADODB.Command нормально работают, а ADODB.RecordSet так и не возвращается из процедуры. Уже все варианты перебрал :(

Код: 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.
Sub myMain()
    Dim con As New ADODB.Connection
    Dim cmm As New ADODB.Command
    Dim rss As New ADODB.Recordset
    
    Call myConnect(con, cmm, rss)
        
    rss.MoveLast
    rss.Close
    
    Set rss = Nothing
    Set con = Nothing
End Sub

Sub myConnect(ByVal myCon As ADODB.Connection, ByVal myCom As ADODB.Command, ByVal myRS As ADODB.Recordset)
    Dim sCon, sSql
           
    sCon = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=CC_UserArch_08_10_20_14_45_18R;Data Source=.\WINCC"
    sSql = "SELECT * FROM [dbo].[UA#Load_1]"
    
    myCon.ConnectionString = sCon
    myCon.CursorLocation =  3 
    myCon.Open
        
    myCom.CommandType =  1 
    Set myCom.ActiveConnection = myCon
    myCom.CommandText = sSql
    
    Set myRS = myCom.Execute
End Sub

Не совсем понял что делает оператор Call, подскажите пожалуйста в двух словах для чего он нужен?
...
Рейтинг: 0 / 0
Можно ли в VBA передать объект ADODB в процедуру?
    #35620214
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Call ничего не делает, это элемент синтаксиса, оставшийся от предыдущих версий бейсика. Записи
Код: plaintext
1.
Call MySub(x)
MySyb x
равнозначны.
автора ADODB.RecordSet так и не возвращается из процедуры
Sub myConnect(ByVal myCon As ADODB.Connection, ByVal myCom As ADODB.Command, ByRef myRS As ADODB.Recordset)
Срочно читать справку по ByVal/ByRef.
...
Рейтинг: 0 / 0
Можно ли в VBA передать объект ADODB в процедуру?
    #35620266
LanSod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем, заработало!!!
Дело в том, что изначально делал как раз через ByRef, т.е. пытался передать ссылку на объект, а не его значение, но не работало. В общем надо отдыхать!!!
...
Рейтинг: 0 / 0
Можно ли в VBA передать объект ADODB в процедуру?
    #35620409
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: LanSod
> Спасибо всем, заработало!!!
> Дело в том, что изначально делал как раз через ByRef, т.е. пытался передать ссылку на объект, а не его значение,
> но не работало. В общем надо отдыхать!!!
А если ошибка? Может лучше переделать так:
Код: 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.
Sub myMain()
    Dim con As New ADODB.Connection
    Dim cmm As New ADODB.Command
    Dim rss As New ADODB.Recordset

    Set rss = myConnect(con, cmm)
    If Not rss Is Nothing then
        rss.MoveLast
        rss.Close
    End If
    Set rss = Nothing
    Set con = Nothing
End Sub

Function myConnect(ByVal myCon As ADODB.Connection, ByVal myCom As ADODB.Command) As ADODB.Recordset
    Set myConnect = Nothing
    Dim sCon As String, sSql As String, myRS As ADODB.Recordset

    sCon = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial 
Catalog=CC_UserArch_08_10_20_14_45_18R;Data Source=.\WINCC"
    sSql = "SELECT * FROM [dbo].[UA#Load_1]"

on error goto labErr

    myCon.ConnectionString = sCon
    myCon.CursorLocation =  3 
    myCon.Open

    myCom.CommandType =  1 
    Set myCom.ActiveConnection = myCon
    myCom.CommandText = sSql

    Set myRS = myCom.Execute
    Set myConnect = myRS
Exit Function
labErr:
' Здесь ничего не делам, т.к. изначально обнулили myConnect, а можем ссылочным
' параметром возвращать причину ошибки, почему ничего не получилось
End Sub


--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Можно ли в VBA передать объект ADODB в процедуру?
    #35620508
LanSod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за предложенный вариант, следующим этапом как раз и хотел добавить обработку ошибок.
...
Рейтинг: 0 / 0
Можно ли в VBA передать объект ADODB в процедуру?
    #35623922
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раз уж всё в одном файле, то предлогаю описать connection как глобальную переменную, и не передавать её как параметр.
Код: plaintext
Public con As ADODB.Connection
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Можно ли в VBA передать объект ADODB в процедуру?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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