如何从函数返回记录集
问题描述:
我在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
我在做什么错?
答
的问题是与设置的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
创建一个指向记录集的指针,在退出函数时关闭它。
这就是为什么它不能包含任何东西。
我也对您的变量名称进行了重新定义,它们与possibe保留字(记录集)相同。我通常使用rs或rsIn或rsWhateverYouWant ...
答
正如Patrick所说,记录集是一个指针。 调用者'Scott_Test'应调用recordset.Close。
Execute方法不能打电话recordset.Close,但是我相信这是确定离开recordset.ActiveConnection =无
+0
我将近的移动到调用函数,但它仍然无法正常工作。以上代码示例已更新。 – Scott 2010-03-17 16:17:51
我搬到了靠近调用函数,但它仍然无法正常工作。我还更改了变量名称,让您感觉更舒适。以上代码示例已更新。 – Scott 2010-03-17 16:18:22