Buscar..


Observaciones

Los ejemplos que se muestran en este tema utilizan el enlace inicial para mayor claridad y requieren una referencia a la biblioteca Microsoft ActiveX Data Object xx. Se pueden convertir a enlace tardío reemplazando las referencias fuertemente tipadas con Object y reemplazando la creación de objetos usando New con CreateObject cuando sea apropiado.

Haciendo una conexión a una fuente de datos

El primer paso para acceder a una fuente de datos a través de ADO es crear un objeto de Connection ADO. Normalmente, esto se hace usando una cadena de conexión para especificar los parámetros de la fuente de datos, aunque también es posible abrir una conexión DSN pasando el DSN, el ID de usuario y la contraseña al método .Open .

Tenga en cuenta que no se requiere un DSN para conectarse a una fuente de datos a través de ADO: cualquier fuente de datos que tenga un proveedor ODBC puede conectarse con la cadena de conexión apropiada. Si bien las cadenas de conexión específicas para diferentes proveedores están fuera del alcance de este tema, ConnectionStrings.com es una excelente referencia para encontrar la cadena adecuada para su proveedor.

Const SomeDSN As String = "DSN=SomeDSN;Uid=UserName;Pwd=MyPassword;"

Public Sub Example()
    Dim database As ADODB.Connection
    Set database = OpenDatabaseConnection(SomeDSN)
    If Not database Is Nothing Then
        '... Do work.
        database.Close          'Make sure to close all database connections.
    End If
End Sub

Public Function OpenDatabaseConnection(ConnString As String) As ADODB.Connection
    On Error GoTo Handler
    Dim database As ADODB.Connection
    Set database = New ADODB.Connection
    
    With database
        .ConnectionString = ConnString
        .ConnectionTimeout = 10             'Value is given in seconds.
        .Open
    End With
     
    OpenDatabaseConnection = database
     
    Exit Function
Handler:
    Debug.Print "Database connection failed. Check your connection string."
End Function

Tenga en cuenta que la contraseña de la base de datos se incluye en la cadena de conexión en el ejemplo anterior solo por razones de claridad. Las mejores prácticas dictarían no almacenar las contraseñas de la base de datos en el código. Esto puede lograrse tomando la contraseña a través de la entrada del usuario o usando la autenticación de Windows.

Recuperando registros con una consulta

Las consultas se pueden realizar de dos formas, ambas de las cuales devuelven un objeto Recordset ADO que es una colección de filas devueltas. Tenga en cuenta que los dos ejemplos a continuación utilizan la función OpenDatabaseConnection del ejemplo de Conexión a un origen de datos con el propósito de ser breves. Recuerde que la sintaxis del SQL pasado al origen de datos es específica del proveedor.

El primer método es pasar la instrucción SQL directamente al objeto Connection, y es el método más sencillo para ejecutar consultas simples:

Public Sub DisplayDistinctItems()
    On Error GoTo Handler
    Dim database As ADODB.Connection
    Set database = OpenDatabaseConnection(SomeDSN)
    
    If Not database Is Nothing Then
        Dim records As ADODB.Recordset
        Set records = database.Execute("SELECT DISTINCT Item FROM Table")
        'Loop through the returned Recordset.
        Do While Not records.EOF      'EOF is false when there are more records.
            'Individual fields are indexed either by name or 0 based ordinal.
            'Note that this is using the default .Fields member of the Recordset.
            Debug.Print records("Item")
            'Move to the next record.
            records.MoveNext
        Loop
    End If
CleanExit:
    If Not records Is Nothing Then records.Close
    If Not database Is Nothing And database.State = adStateOpen Then
        database.Close
    End If
    Exit Sub
Handler:
    Debug.Print "Error " & Err.Number & ": " & Err.Description
    Resume CleanExit
End Sub

El segundo método es crear un objeto de Command ADO para la consulta que desea ejecutar. Esto requiere un poco más de código, pero es necesario para usar consultas parametrizadas:

Public Sub DisplayDistinctItems()
    On Error GoTo Handler
    Dim database As ADODB.Connection
    Set database = OpenDatabaseConnection(SomeDSN)
    
    If Not database Is Nothing Then
        Dim query As ADODB.Command
        Set query = New ADODB.Command
        'Build the command to pass to the data source.
        With query
            .ActiveConnection = database
            .CommandText = "SELECT DISTINCT Item FROM Table"
            .CommandType = adCmdText
        End With
        Dim records As ADODB.Recordset
        'Execute the command to retrieve the recordset.
        Set records = query.Execute()

        Do While Not records.EOF
            Debug.Print records("Item")
            records.MoveNext
        Loop
    End If
CleanExit:
    If Not records Is Nothing Then records.Close
    If Not database Is Nothing And database.State = adStateOpen Then
        database.Close
    End If
    Exit Sub
Handler:
    Debug.Print "Error " & Err.Number & ": " & Err.Description
    Resume CleanExit
End Sub

Tenga en cuenta que los comandos enviados al origen de datos son vulnerables a la inyección de SQL , ya sea intencional o no intencional. En general, las consultas no deben crearse concatenando entradas de usuario de ningún tipo. En su lugar, deben estar parametrizados (ver Crear comandos parametrizados ).

Ejecutando funciones no escalares

Las conexiones ADO se pueden usar para realizar prácticamente cualquier función de base de datos que el proveedor admita a través de SQL. En este caso, no siempre es necesario usar el Recordset devuelto por la función Execute , aunque puede ser útil para obtener asignaciones de claves después de las instrucciones INSERT con @@ Identity o comandos SQL similares. Tenga en cuenta que el siguiente ejemplo utiliza la función OpenDatabaseConnection del ejemplo de Conexión a un origen de datos con el propósito de brevedad.

Public Sub UpdateTheFoos()
    On Error GoTo Handler
    Dim database As ADODB.Connection
    Set database = OpenDatabaseConnection(SomeDSN)
    
    If Not database Is Nothing Then
        Dim update As ADODB.Command
        Set update = New ADODB.Command
        'Build the command to pass to the data source.
        With update
            .ActiveConnection = database
            .CommandText = "UPDATE Table SET Foo = 42 WHERE Bar IS NULL"
            .CommandType = adCmdText
            .Execute        'We don't need the return from the DB, so ignore it.
        End With
    End If
CleanExit:
    If Not database Is Nothing And database.State = adStateOpen Then
        database.Close
    End If
    Exit Sub
Handler:
    Debug.Print "Error " & Err.Number & ": " & Err.Description
    Resume CleanExit
End Sub

Tenga en cuenta que los comandos enviados al origen de datos son vulnerables a la inyección de SQL , ya sea intencional o no intencional. En general, las sentencias de SQL no deben crearse concatenando entradas de usuario de ningún tipo. En su lugar, deben estar parametrizados (ver Crear comandos parametrizados ).

Creando comandos parametrizados

Cada vez que el SQL ejecutado a través de una conexión ADO debe contener información del usuario, se considera la mejor práctica para parametrizarlo a fin de minimizar la posibilidad de inyección de SQL. Este método también es más legible que las concatenaciones largas y facilita un código más robusto y mantenible (es decir, mediante el uso de una función que devuelve una matriz de Parameter ).

En la sintaxis estándar de ODBC, se dan los parámetros ? los "marcadores de posición" en el texto de la consulta, y luego los parámetros se agregan al Command en el mismo orden en que aparecen en la consulta.

Tenga en cuenta que el ejemplo a continuación utiliza la función OpenDatabaseConnection de Hacer una conexión a una fuente de datos por brevedad.

Public Sub UpdateTheFoos()
    On Error GoTo Handler
    Dim database As ADODB.Connection
    Set database = OpenDatabaseConnection(SomeDSN)
    
    If Not database Is Nothing Then
        Dim update As ADODB.Command
        Set update = New ADODB.Command
        'Build the command to pass to the data source.
        With update
            .ActiveConnection = database
            .CommandText = "UPDATE Table SET Foo = ? WHERE Bar = ?"
            .CommandType = adCmdText
            
            'Create the parameters.
            Dim fooValue As ADODB.Parameter
            Set fooValue = .CreateParameter("FooValue", adNumeric, adParamInput)
            fooValue.Value = 42
            
            Dim condition As ADODB.Parameter
            Set condition = .CreateParameter("Condition", adBSTR, adParamInput)
            condition.Value = "Bar"
            
            'Add the parameters to the Command
            .Parameters.Append fooValue
            .Parameters.Append condition
            .Execute
        End With
    End If
CleanExit:
    If Not database Is Nothing And database.State = adStateOpen Then
        database.Close
    End If
    Exit Sub
Handler:
    Debug.Print "Error " & Err.Number & ": " & Err.Description
    Resume CleanExit
End Sub

Nota: el ejemplo anterior muestra una instrucción UPDATE parametrizada, pero a cualquier instrucción SQL se le pueden dar parámetros.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow