Usar ADO con SQL Server Native Client

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Importante

SQL Server Native Client (a menudo abreviado SNAC) se ha quitado de SQL Server 2022 (16.x) y SQL Server Management Studio 19 (SSMS). No se recomienda SQL Server Native Client (SQLNCLI o SQLNCLI11) ni el proveedor OLE DB de Microsoft heredado para SQL Server (SQLOLEDB) para el desarrollo de nuevas aplicaciones. Cambie al nuevo controlador OLE DB de Microsoft (MSOLEDBSQL) para SQL Server o al controlador ODBC de Microsoft ODBC Driver for SQL Server más reciente de ahora en adelante. Para SQLNCLI que se incluye como componente de SQL Server motor de base de datos (versiones 2012 a 2019), consulte esta excepción de ciclo de vida de soporte técnico.

Para aprovechar las nuevas características introducidas en SQL Server 2005 (9.x), como varios conjuntos de resultados activos (MARS), notificaciones de consulta, tipos definidos por el usuario (UDT) o el nuevo tipo de datos xml, las aplicaciones existentes que usan Objetos de datos ActiveX (ADO) deben usar el proveedor OLE DB SQL Server Native Client como proveedor de acceso a datos.

Si no necesita usar ninguna de las nuevas características introducidas en SQL Server 2005 (9.x), no es necesario usar el proveedor OLE DB de SQL Server Native Client; puede seguir usando el proveedor de acceso a datos actual, que suele ser SQLOLEDB. Si va a mejorar una aplicación existente y necesita usar las nuevas características introducidas en SQL Server 2005 (9.x), debe usar SQL Server Native Client proveedor OLE DB.

Nota:

Si va a desarrollar una nueva aplicación, se recomienda usar ADO.NET y el proveedor de datos de .NET Framework para SQL Server en lugar de SQL Server Native Client acceder a todas las características nuevas de las versiones recientes de SQL Server. Para obtener más información sobre el proveedor de datos de .NET Framework para SQL Server, consulte la documentación del SDK de .NET Framework para ADO.NET.

Para permitir que ADO use nuevas características de las versiones recientes de SQL Server, se han realizado algunas mejoras en el proveedor OLE DB SQL Server Native Client que amplía 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. SQL Server Native Client agrega la propiedad de inicialización SSPROP_INIT_DATATYPECOMPATIBILITY al conjunto de propiedades DBPROPSET_SQLSERVERDBINIT para que las usen las aplicaciones de ADO para que los nuevos tipos de datos se expongan de forma compatible con ADO. Además, el proveedor OLE DB de SQL Server Native Client 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 usa el proveedor OLE DB (SQLNCLI11) SQL Server Native Client 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.

Habilitar SQL Server Native Client desde ADO

Para habilitar el uso de SQL Server Native Client, las aplicaciones de ADO deberán implementar las siguientes palabras clave en sus cadenas de conexión:

  • Provider=SQLNCLI11

  • DataTypeCompatibility=80

Para obtener más información sobre las palabras clave de cadena de conexiones de ADO admitidas en SQL Server Native Client, consulte Uso de palabras clave de cadena de conexión con SQL Server Native Client.

A continuación se muestra un ejemplo de cómo establecer una cadena de conexión de ADO que está totalmente habilitada para trabajar con SQL Server Native Client, incluida la habilitación de la característica mars:

Dim con As New ADODB.Connection  
  
con.ConnectionString = "Provider=SQLNCLI11;" _  
         & "Server=(local);" _  
         & "Database=AdventureWorks;" _   
         & "Integrated Security=SSPI;" _  
         & "DataTypeCompatibility=80;" _  
         & "MARS Connection=True;"  
con.Open  

Ejemplos

En las secciones siguientes se proporcionan ejemplos de cómo puede usar ADO con el proveedor OLE DB de SQL Server Native Client.

Recuperar datos de 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=SQLNCLI11;" _  
         & "Server=(local);" _  
         & "Database=AdventureWorks;" _   
         & "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 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=SQLNCLI11;" _  
         & "Server=(local);" _  
         & "Database=AdventureWorks;" _   
         & "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, la cadena de conexión se construye para habilitar MARS a través del proveedor OLE DB de SQL Server Native Client y, a continuación, se crean dos objetos de conjunto de registros para ejecutarse con la misma conexión.

Dim con As New ADODB.Connection  
  
con.ConnectionString = "Provider=SQLNCLI11;" _  
         & "Server=(local);" _  
         & "Database=AdventureWorks;" _   
         & "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, esto produciría una sobrecarga adicional. Con la característica MARS expuesta por el proveedor OLE DB de SQL Server Native Client, obtendrá varios resultados activos en la única conexión.

Consulte también

Generar aplicaciones con SQL Server Native Client