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.