Uso de ADO con el controlador OLE DB para SQL Server
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
Para aprovechar las características nuevas introducidas en SQL Server 2005 (9.x), como los conjuntos de resultados activos múltiples (MARS), las notificaciones de consulta, los tipos definidos por el usuario (UDT) o el nuevo tipo de datos xml, las aplicaciones existentes que usan Objetos de datos ActiveX (ADO) deberían usar el controlador OLE DB para SQL Server como su proveedor de acceso a datos.
Para permitir que ADO use las características nuevas de las versiones más recientes de SQL Server, se han realizado algunas mejoras en OLE DB Driver for SQL Server que extiende las características principales de OLE DB. Estas mejoras permiten a las aplicaciones ADO usar las características más recientes de SQL Server y usar dos tipos de datos introducidos en SQL Server 2005 (9.x): xml y udt. Estas mejoras también aprovechan las mejoras realizadas en los tipos de datos varchar, nvarchar y varbinary. El controlador OLE DB para SQL Server agrega la propiedad de inicialización SSPROP_INIT_DATATYPECOMPATIBILITY al conjunto de propiedades DBPROPSET_SQLSERVERDBINIT para que las aplicaciones ADO la usen de modo que los nuevos tipos de datos se expongan de un modo compatible con ADO. Además, el proveedor OLE DB Driver for SQL Server también define una nueva palabra clave de cadena de conexión denominada DataTypeCompatibility que se establece en la cadena de conexión.
Nota
Las aplicaciones ADO existentes pueden obtener acceso y actualizar XML, UDT, texto de valores grandes y valores de campo binarios mediante el proveedor SQLOLEDB. Los nuevos tipos de datos de mayor tamaño varchar(max) , nvarchar(max) y varbinary(max) se devuelven como los tipos ADO adLongVarChar, adLongVarWChar y adLongVarBinary respectivamente. Las columnas XML se devuelven como adLongVarChar y las columnas UDT se devuelven como adVarBinary. Sin embargo, si utiliza OLE DB Driver for SQL Server (MSOLEDBSQL19 o MSOLEDBSQL) en lugar de SQLOLEDB, debe asegurarse de establecer la palabra clave DataTypeCompatibility en “80” para que los nuevos tipos de datos se asignen correctamente a los tipos de datos de ADO.
Habilitación de OLE DB Driver for SQL Server desde ADO
Para habilitar el uso del controlador OLE DB para SQL Server, las aplicaciones ADO necesitarán implementar las siguientes palabras clave en sus cadenas de conexión:
Provider=MSOLEDBSQL19
DataTypeCompatibility=80
Para más información sobre las palabras clave de cadena de conexión de ADO compatibles en el controlador OLE DB para SQL Server, vea Uso de palabras clave de cadena de conexión con el controlador OLE DB para SQL Server.
El siguiente código es un ejemplo sobre la forma de establecer una cadena de conexión de ADO totalmente habilitada para funcionar con OLE DB Driver for SQL Server, así como la forma de habilitar la característica MARS:
Dim con As New ADODB.Connection
con.ConnectionString = "Provider=MSOLEDBSQL19;" _
& "Server=(local);" _
& "Database=AdventureWorks;" _
& "Use Encryption for Data=Optional;" _
& "Integrated Security=SSPI;" _
& "DataTypeCompatibility=80;" _
& "MARS Connection=True;"
con.Open
Ejemplos
En las secciones siguientes se proporcionan ejemplos sobre la forma de usar ADO con OLE DB Driver for SQL Server.
Recuperar datos de la columna XML
En este ejemplo, se usa un conjunto de registros para recuperar y mostrar los datos de una columna XML en la base de datos de ejemplo AdventureWorks de SQL Server.
Dim con As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim sXMLResult As String
con.ConnectionString = "Provider=MSOLEDBSQL19;" _
& "Server=(local);" _
& "Database=AdventureWorks;" _
& "Use Encryption for Data=Optional;" _
& "Integrated Security=SSPI;" _
& "DataTypeCompatibility=80;"
con.Open
' Get the xml data as a recordset.
Set rst.ActiveConnection = con
rst.Source = "SELECT AdditionalContactInfo FROM Person.Contact " _
& "WHERE AdditionalContactInfo IS NOT NULL"
rst.Open
' Display the data in the recordset.
While (Not rst.EOF)
sXMLResult = rst.Fields("AdditionalContactInfo").Value
Debug.Print (sXMLResult)
rst.MoveNext
End While
con.Close
Set con = Nothing
Nota
No se admite el filtrado de conjuntos de registros con columnas XML. Si se utiliza, se devolverá un error.
Recuperar datos de la columna UDT
En este ejemplo, se usa un objeto Command para ejecutar una consulta SQL que devuelve un UDT, los datos del UDT se actualizan y, después, los nuevos datos vuelven a insertarse en la base de datos. En este ejemplo, se asume que el UDT Point ya se ha registrado en la base de datos.
Dim con As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim rst As New ADODB.Recordset
Dim strOldUDT As String
Dim strNewUDT As String
Dim aryTempUDT() As String
Dim strTempID As String
Dim i As Integer
con.ConnectionString = "Provider=MSOLEDBSQL19;" _
& "Server=(local);" _
& "Database=AdventureWorks;" _
& "Use Encryption for Data=Optional;" _
& "Integrated Security=SSPI;" _
& "DataTypeCompatibility=80;"
con.Open
' Get the UDT value.
Set cmd.ActiveConnection = con
cmd.CommandText = "SELECT ID, Pnt FROM dbo.Points.ToString()"
Set rst = cmd.Execute
strTempID = rst.Fields(0).Value
strOldUDT = rst.Fields(1).Value
' Do something with the UDT by adding i to each point.
arytempUDT = Split(strOldUDT, ",")
i = 3
strNewUDT = LTrim(Str(Int(aryTempUDT(0)) + i)) + "," + _
LTrim(Str(Int(aryTempUDT(1)) + i))
' Insert the new value back into the database.
cmd.CommandText = "UPDATE dbo.Points SET Pnt = '" + strNewUDT + _
"' WHERE ID = '" + strTempID + "'"
cmd.Execute
con.Close
Set con = Nothing
Habilitar y utilizar MARS
En este ejemplo, se crea una cadena de conexión para habilitar MARS a través del controlador OLE DB para SQL Server y, después, se crean dos objetos de conjunto de registros para ejecutarlos mediante la misma conexión.
Dim con As New ADODB.Connection
con.ConnectionString = "Provider=MSOLEDBSQL19;" _
& "Server=(local);" _
& "Database=AdventureWorks;" _
& "Use Encryption for Data=Optional;" _
& "Integrated Security=SSPI;" _
& "DataTypeCompatibility=80;" _
& "MARS Connection=True;"
con.Open
Dim recordset1 As New ADODB.Recordset
Dim recordset2 As New ADODB.Recordset
Dim recordsaffected As Integer
Set recordset1 = con.Execute("SELECT * FROM Table1", recordsaffected, adCmdText)
Set recordset2 = con.Execute("SELECT * FROM Table2", recordsaffected, adCmdText)
con.Close
Set con = Nothing
En versiones anteriores del proveedor OLE DB, este código hacía que se crease una conexión implícita en la segunda ejecución porque solo podía abrirse un conjunto de resultados activo por cada conexión única. Dado que la conexión implícita no estaba agrupada en el grupo de conexiones OLE DB, este comportamiento produciría una sobrecarga adicional. Con la característica MARS expuesta por el controlador OLE DB para SQL Server, se obtienen varios resultados activos en la conexión única.
Consulte también
Compilación de aplicaciones con el controlador OLE DB para SQL Server