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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top