Я создаю уровень доступа к данным в 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
Что я делаю неправильно?
Проблема заключалась в настройке 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
Set Execute = recordset
создает указатель на набор записей, который вы закрываете при выходе из функции.
Вот почему он ничего не может содержать.
Я также не согласен с вашими именами переменных, которые идентичны возможным зарезервированным словам (набор записей). Обычно я использую rs, rsIn или rsWhateverYouWant ...
Как упоминал Патрик, набор записей является указателем. Вызывающий 'Scott_Test' должен вместо этого вызвать recordset.Close.
Метод Execute НЕ МОЖЕТ вызывать набор записей.Close, однако я считаю, что можно оставить набор записей. ActiveConnection = Nothing