Как вернуть набор записей из функции

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

Следующая функция содержится в классе с именем DataAccessLayer. Класс содержит функции Connect и Disconnect, которые обрабатывают открытие и закрытие соединения.


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

Что я делаю не так?


person Scott    schedule 17.03.2010    source источник


Ответы (3)


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

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
person Scott    schedule 17.03.2010

Set Execute = recordset

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

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

person Patrick Honorez    schedule 17.03.2010
comment
Я переместил close в вызывающую функцию, но она все еще не работает. Я также изменил имена переменных, чтобы вам было удобнее. Вышеприведенный пример кода был обновлен. - person Scott; 17.03.2010

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

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

person user52212    schedule 17.03.2010
comment
Я переместил close в вызывающую функцию, но она все еще не работает. Вышеприведенный пример кода был обновлен. - person Scott; 17.03.2010