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

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


+100

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

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
28.10.2008, 10:40
    #35619704
LanSod
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в VBA передать объект ADODB в процедуру?
Спасибо за ответы.
Хочу вынести из основного тела программы команды создания объектов 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
28.10.2008, 11:02
    #35619766
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в VBA передать объект ADODB в процедуру?
Код: 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
28.10.2008, 12:50
    #35620148
LanSod
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в VBA передать объект ADODB в процедуру?
Сделал так же у себя: в итоге 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
28.10.2008, 13:17
    #35620214
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в VBA передать объект ADODB в процедуру?
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
28.10.2008, 13:31
    #35620266
LanSod
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в VBA передать объект ADODB в процедуру?
Спасибо всем, заработало!!!
Дело в том, что изначально делал как раз через ByRef, т.е. пытался передать ссылку на объект, а не его значение, но не работало. В общем надо отдыхать!!!
...
Рейтинг: 0 / 0
28.10.2008, 14:09
    #35620409
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в VBA передать объект ADODB в процедуру?
> Автор: 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
28.10.2008, 14:37
    #35620508
LanSod
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в VBA передать объект ADODB в процедуру?
Спасибо за предложенный вариант, следующим этапом как раз и хотел добавить обработку ошибок.
...
Рейтинг: 0 / 0
29.10.2008, 18:46
    #35623922
Шыфл
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли в VBA передать объект ADODB в процедуру?
Раз уж всё в одном файле, то предлогаю описать connection как глобальную переменную, и не передавать её как параметр.
Код: plaintext
Public con As ADODB.Connection
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Можно ли в VBA передать объект ADODB в процедуру? / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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