使用全局临时记录集在模块 vba 内交换信息

Use global temp recordset for exchange info inside module vba

我想开发一个函数来执行对数据库的所有查询并将结果存储在全局记录集中以供其他函数使用,但是当函数或子函数结束时,全局记录集变空(超出范围)。我该如何解决这个问题?

模块内容:

Global rsResultado As ADODB.Recordset

Sub main()
    sql = "query works ok, I get data"
    realizarConsulta (sql)
    Debug.Print "Check result: " & rsResultado.Fields(0) 'Here I lost data setted in function
End Sub

Public Function realizarConsulta(sql As String) As Recordset
    conectarBD
    Debug.Print "SQL Ejecutada -->" & sql
    Set rsResultado = New ADODB.Recordset

    rsResultado.Open sql, Conn
    'Set realizarConsulta = rs
    'Set rsResultado = rs

    Do While Not rsResultado.EOF
        Debug.Print "Registro: " & rsResultado.Fields(0)
        rsResultado.MoveNext
        'Here I can see the content of the global recordset
    Loop

    'rs.Close
    Conn.Close
End Function

有什么办法可以解决这个问题吗?我做错了什么?

全局 Recordset 变空,因为你在 Function 中关闭了连接,Recordset 在 while 循环后用完了所有记录,你必须从 [=12= 设置记录集] :

1- 在主子中设置 Recordset 对象,如:Set rsResultado = realizarConsulta(sql)

2- 使用 rsResultado.MoveFirst

初始化 Recordset 对象

3-在函数内设置函数对象:Set realizarConsulta = rsResultado

4-不关闭连接对象Conn

Sub main()
    '..
    Set rsResultado = realizarConsulta(sql)
    rsResultado.MoveFirst
    Debug.Print "Check result: " & rsResultado.Fields(0)
End Sub

Public Function realizarConsulta(sql As String) As Recordset
    conectarBD
    Debug.Print "SQL Ejecutada -->" & sql
    Set rsResultado = New ADODB.Recordset

    rsResultado.Open sql, Conn

    Do While Not rsResultado.EOF
        Debug.Print "Registro: " & rsResultado.Fields(0)
        rsResultado.MoveNext
    Loop

    Set realizarConsulta = rsResultado

    'rs.Close
    'Conn.Close
End Function

您还需要将与数据库的连接设置为Global。否则,您的 RecordSet 会在连接关闭时重置。所以,如果你添加

Global conDataBaseConnection As ADODB.Connection

那么它应该可以工作(在我的系统上测试过)。

因为我没有看到您的 ADODB.Connection 声明,所以我只是通过示例命名它。显然,您必须更改代码以匹配您的程序。