Cómo devolver un conjunto de registros de una función
Pregunta
Estoy construyendo una capa de acceso a datos en Excel VBA y tiene problemas para devolver un conjunto de registros. La función Ejecutar () en mi clase es, sin duda recuperando una fila de la base de datos, pero no parece estar volviendo nada.
La siguiente función está contenida en una clase llamada DataAccessLayer. La clase contiene funciones de conexión y desconexión que manejan abrir y cerrar la conexión.
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
Esto es una función pública que estoy usando en la celda A1 de la hoja de cálculo para la prueba.
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
¿Qué estoy haciendo mal?
Solución
El problema era con el establecimiento de la ActiveConnection = nada. El siguiente código funciona:
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
Otros consejos
Set Execute = recordset
crea un puntero al conjunto de registros, que se cierra al salir de la función.
Eso es por eso que no puede contener nada.
También soy relectant en sus nombres de variables que son idénticos a possibe palabras reservadas (de registros). Yo generalmente uso rs o ṛṣīn o rsWhateverYouWant ...
Como se mencionó por Patrick, el conjunto de registros es un puntero. The Caller 'scott_test' debe llamar Recordset.Close lugar.
El método no puede llamar Recordset.Close ejecutar, sin embargo, creo que está bien para salir de la recordset.ActiveConnection = Nada