Verwenden von ADO mit SQL Server Native Client

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Wichtig

Der SQL Server Native Client (häufig abgekürzt mit SNAC) wurde aus SQL Server 2022 (16.x) und SQL Server Management Studio 19 (SSMS) entfernt. Der SQL Server Native Client (SQLNCLI oder SQLNCLI11) und der Microsoft OLE DB-Legacyanbieter für SQL Server (SQLOLEDB) werden für neue Anwendungsentwicklungen nicht empfohlen. Verwenden Sie in Zukunft den neuen Microsoft OLE DB-Treiber für SQL Server (MSOLEDBSQL) oder den neuesten Microsoft ODBC Driver for SQL Server. Informationen zu SQLNCLI, das als Komponente von SQL Server Datenbank-Engine (Versionen 2012 bis 2019) ausgeliefert wird, finden Sie in dieser Supportlebenszyklus-Ausnahme.

Um die in SQL Server 2005 (9.x) eingeführten neuen Features wie mehrere aktive Resultsets (MARS), Abfragebenachrichtigungen, benutzerdefinierte Typen (UDTs) oder den neuen xml-Datentyp nutzen zu können, sollten vorhandene Anwendungen, die ActiveX-Datenobjekte (ActiveX Data Objects, ADO) verwenden, den SQL Server Native Client OLE DB-Anbieter als Datenzugriffsanbieter verwenden.

Wenn Sie keines der neuen Features verwenden müssen, die in SQL Server 2005 (9.x) eingeführt wurden, ist es nicht erforderlich, den SQL Server Native Client OLE DB-Anbieter zu verwenden. Sie können weiterhin Ihren aktuellen Datenzugriffsanbieter verwenden, der in der Regel SQLOLEDB ist. Wenn Sie eine vorhandene Anwendung verbessern und die in SQL Server 2005 (9.x) eingeführten neuen Features verwenden müssen, sollten Sie SQL Server Native Client OLE DB-Anbieter verwenden.

Hinweis

Wenn Sie eine neue Anwendung entwickeln, empfiehlt es sich, ADO.NET und den .NET Framework Datenanbieter für SQL Server anstelle von SQL Server Native Client zu verwenden, um auf alle neuen Features der neuesten Versionen von SQL Server zuzugreifen. Weitere Informationen zum .NET Framework-Datenanbieter für SQL Server finden Sie in der .NET Framework SDK-Dokumentation für ADO.NET.

Damit ADO neue Features neuer Versionen von SQL Server verwenden kann, wurden einige Verbesserungen am SQL Server Native Client OLE DB-Anbieter vorgenommen, der die Kernfeatures von OLE DB erweitert. Diese Erweiterungen erlauben es ADO-Anwendungen, neuere SQL Server-Features zu verwenden und zwei Datentypen zu verarbeiten, die in SQL Server 2005 (9.x) eingeführt wurden: XML und UDT. Diese Erweiterungen machen sich auch Erweiterungen der Datentypen varchar, nvarchar und varbinary zunutze. SQL Server Native Client fügt die SSPROP_INIT_DATATYPECOMPATIBILITY Initialisierungseigenschaft der DBPROPSET_SQLSERVERDBINIT-Eigenschaft hinzu, die für die Verwendung durch ADO-Anwendungen festgelegt ist, sodass die neuen Datentypen in einer mit ADO kompatiblen Weise verfügbar gemacht werden. Darüber hinaus definiert der SQL Server Native Client OLE DB-Anbieter auch eine neue Verbindungszeichenfolge Schlüsselwort (keyword) mit dem Namen DataTypeCompatibility, die in der Verbindungszeichenfolge festgelegt ist.

Hinweis

Vorhandene ADO-Anwendungen können über den SQLOLEDB-Anbieter auf XML, UDT, umfangreiche Textwerte und Werte von Binärfeldern zugreifen und diese aktualisieren. Die neuen größeren Datentypen varchar(max) , nvarchar(max) und varbinary(max) werden als die ADO-Typen adLongVarChar, adLongVarWChar bzw. adLongVarBinary zurückgegeben. XML-Spalten werden als adLongVarChar zurückgegeben, und UDT-Spalten werden als adVarBinary zurückgegeben. Wenn Sie jedoch den SQL Server Native Client OLE DB-Anbieter (SQLNCLI11) anstelle von SQLOLEDB verwenden, müssen Sie sicherstellen, dass Sie die DataTypeCompatibility-Schlüsselwort (keyword) auf "80" festlegen, damit die neuen Datentypen den ADO-Datentypen ordnungsgemäß zugeordnet werden.

Aktivieren von SQL Server Native Client über ADO

Um die Verwendung von SQL Server Native Client zu ermöglichen, müssen ADO-Anwendungen die folgenden Schlüsselwörter in ihren Verbindungszeichenfolgen implementieren:

  • Provider=SQLNCLI11

  • DataTypeCompatibility=80

Weitere Informationen zu den in SQL Server Native Client unterstützten Schlüsselwörtern für ADO-Verbindungszeichenfolgen finden Sie unter Verwenden von Verbindungszeichenfolgenschlüsselwörtern mit SQL Server Native Client.

Im Folgenden finden Sie ein Beispiel für das Einrichten einer ADO-Verbindungszeichenfolge, die vollständig für die Arbeit mit SQL Server Native Client aktiviert ist, einschließlich der Aktivierung des MARS-Features:

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

Beispiele

Die folgenden Abschnitte enthalten Beispiele für die Verwendung von ADO mit dem SQL Server Native Client OLE DB-Anbieters.

Abrufen von XML-Spaltendaten

In diesem Beispiel wird ein Recordset verwendet, um die Daten aus einer XML-Spalte der SQL Server-Beispieldatenbank AdventureWorks abzurufen und anzuzeigen.

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  

Hinweis

Recordset-Filter werden bei XML-Spalten nicht unterstützt. Wenn sie verwendet werden, wird ein Fehler zurückgegeben.

Abrufen von UDT-Spaltendaten

In diesem Beispiel wird ein Command-Objekt verwendet, um eine SQL-Abfrage auszuführen, die einen UDT zurückgibt. Der UDT wird aktualisiert, und neue Daten werden anschließend wieder in die Datenbank eingefügt. In diesem Beispiel wird davon ausgegangen, dass der UDT Point bereits in der Datenbank registriert wurde.

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  

Aktivieren und Verwenden von MARS

In diesem Beispiel wird die Verbindungszeichenfolge erstellt, um MARS über den SQL Server Native Client OLE DB-Anbieter zu aktivieren, und dann werden zwei Recordsetobjekte erstellt, die mit derselben Verbindung ausgeführt werden.

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  

In früheren Versionen des OLE DB-Anbieters hätte dieser Code bewirkt, dass für den zweiten Execute-Aufruf eine Standardverbindung erstellt wird, weil in diesen Versionen nur ein aktives Resultset pro Verbindung geöffnet werden konnte. Weil die Standardverbindung nicht in den OLE DB-Verbindungspool aufgenommen wurde, bedeutete dies zusätzlichen Aufwand. Wenn das MARS-Feature vom SQL Server Native Client OLE DB-Anbieter verfügbar gemacht wird, erhalten Sie mehrere aktive Ergebnisse für die eine Verbindung.

Weitere Informationen

Erstellen von Anwendungen mit SQL Server Native Client