使用全局临时记录集在模块 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
声明,所以我只是通过示例命名它。显然,您必须更改代码以匹配您的程序。
我想开发一个函数来执行对数据库的所有查询并将结果存储在全局记录集中以供其他函数使用,但是当函数或子函数结束时,全局记录集变空(超出范围)。我该如何解决这个问题?
模块内容:
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
声明,所以我只是通过示例命名它。显然,您必须更改代码以匹配您的程序。