Как вернуть набор записей из функции - PullRequest
5 голосов
/ 17 марта 2010

Я создаю слой доступа к данным в 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

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

Ответы [ 3 ]

7 голосов
/ 17 марта 2010

Проблема была с установкой 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
1 голос
/ 17 марта 2010
Set Execute = recordset

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

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

0 голосов
/ 17 марта 2010

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

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

...