代码之家  ›  专栏  ›  技术社区  ›  Scott Vander Molen

如何从函数返回记录集

  •  4
  • Scott Vander Molen  · 技术社区  · 14 年前

    我正在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 回复  |  直到 12 年前
        1
  •  6
  •   Scott Vander Molen    14 年前

    设置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
        2
  •  1
  •   iDevlop    14 年前
    Set Execute = recordset
    

    创建指向记录集的指针,退出函数时关闭该指针。
    这就是为什么它不能包含任何东西。

    我也关心你的变量名,这些变量名与保留字(记录集)相同。我通常用RS或RSIN或任何你想要的…

        3
  •  0
  •   user52212    14 年前

    正如帕特里克所提到的,记录集是一个指针。 调用方“Scott_Test”应调用记录集。请改为关闭。

    execute方法不能调用recordset.close,但是我认为保留recordset.activeconnection=nothing是可以的。