2016-04-28 19 views
0

我想开发一个函数,执行所有查询到数据库并将结果存储在全局记录集中以便在其他函数中使用它,但是当函数或子结束时,全局记录集变空(超出范围)。我怎样才能解决这个问题?使用全局临时记录集模块内的交换信息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 

有没有什么办法来解决这个问题?我究竟做错了什么?

+0

我有一个模块的全局记录集,我想设置(把它的信息)该记录集函数或子内,然后在该函数(或子)以外使用它。但是,当取出函数(或子)时,该记录集脱离了上下文。如果它是一个全局变量,它的值被设置在一个函数内,它怎么会这样?它应该保持de函数(或子函数)之外的数据。 – Carol

回答

0

全球Recordset得到空的,因为你Function内紧密联接,该Recordset while循环后,花光了所有的记录,并且必须从Function设置记录:

1-像主子设置Recordset对象: Set rsResultado = realizarConsulta(sql)

2-初始化与rsResultado.MoveFirst

3-集函数对象Recordset对象内部功能的: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 
+0

我尝试过,但仍然得到相同的结果。一旦我离开函数,全局记录集就没有数据。在变量检查器中,我看到值“Out of context”。感谢您的回答 – Carol

+1

我改变了答案,请测试它吗?这对我来说很有用。 –

+0

这就是答案。我失败了,因为我正在关闭数据库连接。我试过了,它工作了!非常感谢!! – Carol

0

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

Global conDataBaseConnection As ADODB.Connection

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

由于我没有看到您的ADODB.Connection声明,我刚刚通过示例进行了命名。显然,你必须改变代码以符合你的编程。

+0

我错了,因为我关闭了BD连接,当你这样做时,你失去了存储在取决于该连接的记录集中的任何数据。无论如何感谢您的时间。 – Carol