Как возвратить recordset из функции

Я создаю уровень доступа к данным в Excel VBA и испытываю затруднения при возврате recordset. Выполнение () функция в моем классе определенно получает строку от базы данных, но, кажется, ничего не возвращает.

Следующая функция содержится в классе под названием DataAccessLayer. Класс содержит Подключение функций и Разъединение, которые обрабатывают открытие и закрытие соединения.


Public Function Execute(ByVal sqlQuery As String) As ADODB.recordset
    Dim rs As ADODB.recordset
    Set rs = New ADODB.recordset
    Dim recordsAffected As Long

    ' Make sure we're connected to the database.
    If Connect Then
        Set command = New ADODB.command

        With command
            .ActiveConnection = connection
            .CommandText = sqlQuery
            .CommandType = adCmdText
        End With

        'Set rs = command.Execute(recordsAffected)
        'Set Execute = command.Execute(recordsAffected)
        rs.Open command.Execute(recordsAffected)
        rs.ActiveConnection = Nothing
        Set Execute = rs
        Set command = Nothing
        Call Disconnect
    End If
End Function

Вот государственная функция, что я использую в ячейке A1 своей электронной таблицы для тестирования.


Public Function Scott_Test()
    Dim Database As New DataAccessLayer
    'Dim rs As ADODB.recordset
    'Set rs = CreateObject("ADODB.Recordset")
    Set rs = New ADODB.recordset

    Set rs = Database.Execute("SELECT item_desc_1 FROM imitmidx_sql WHERE item_no = '11001'")
    'rs.Open Database.Execute("SELECT item_desc_1 FROM imitmidx_sql WHERE item_no = '11001'")
    'rs.Open

    ' This never displays.
    MsgBox rs.EOF

    If Not rs.EOF Then
        ' This is displaying #VALUE! in cell A1.
        Scott_Test = rs!item_desc_1
        rs.Close
    End If

    rs.ActiveConnection = Nothing
    Set rs = Nothing
End Function

Что я делаю неправильно?

5
задан Community 9 July 2018 в 19:34
поделиться

3 ответа

Проблема заключалась в настройке ActiveConnection = Ничего такого. Следующий код работает:

Public Function Execute(ByVal sqlQuery As String) As ADODB.recordset
    Dim rs As ADODB.recordset
    Set rs = New ADODB.recordset
    Dim recordsAffected As Long

    ' Make sure we are connected to the database.
    If Connect Then
        Set command = New ADODB.command

        With command
            .ActiveConnection = connection
            .CommandText = sqlQuery
            .CommandType = adCmdText
        End With

        rs.Open command.Execute(recordsAffected)

        Set Execute = rs
        Set command = Nothing
        Call Disconnect
    End If
End Function
7
ответ дан 14 December 2019 в 04:35
поделиться
Set Execute = recordset

создает указатель на набор записей, который вы закрываете при выходе из функции.
Вот почему он ничего не может содержать.

Я также не согласен с вашими именами переменных, которые идентичны возможным зарезервированным словам (набор записей). Обычно я использую rs, rsIn или rsWhateverYouWant ...

1
ответ дан 14 December 2019 в 04:35
поделиться

Как упоминал Патрик, набор записей является указателем. Вызывающий 'Scott_Test' должен вместо этого вызвать recordset.Close.

Метод Execute НЕ МОЖЕТ вызывать набор записей.Close, однако я считаю, что можно оставить набор записей. ActiveConnection = Nothing

0
ответ дан 14 December 2019 в 04:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: