Verwenden von ADO mit SQL Server Native Client

Um die neuen Funktionen von SQL Server 2005, beispielsweise mehrere aktive Resultsets (MARS), Abfragebenachrichtigungen, benutzerdefinierte Typen (UDTs) oder den neuen xml-Datentyp, nutzen zu können, sollten bestehende Anwendungen, die ADO (ActiveX Data Objects) verwenden, den OLE DB-Anbieter von SQL Server Native Client als Datenzugriffsanbieter nutzen.

Wenn keine der neuen Funktionen von SQL Server 2005 erforderlich ist, dann ist es auch nicht notwendig, den OLE DB-Anbieter von SQL Server Native Client zu verwenden. Sie können weiterhin mit dem aktuellen Datenzugriffsanbieter (in der Regel SQLOLEDB) arbeiten. Wenn Sie eine bestehende Anwendung erweitern und die neuen Funktionen von SQL Server 2005 verwenden müssen, dann sollten Sie den OLE DB-Anbieter von SQL Server Native Client verwenden.

HinweisHinweis

Wenn Sie eine neue Anwendung entwickeln, wird empfohlen, über ADO.NET und den .NET Framework-Datenanbieter für SQL Server statt über SQL Server Native Client auf die neuen Funktionen der letzten 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 die neuen Features der letzten Versionen von SQL Server nutzen kann, wurde der OLE DB-Anbieter von SQL Server Native Client, der die Kernfunktionen von OLE DB erweitert, um einige Erweiterungen ergänzt. Diese Erweiterungen erlauben es ADO-Anwendungen, neuere SQL Server-Funktionen zu nutzen und zwei Datentypen zu verarbeiten, die in SQL Server 2005eingeführt wurden: xml und udt. Diese Erweiterungen machen sich auch Erweiterungen der Datentypen varchar, nvarchar und varbinary zunutze. SQL Server Native Client fügt für ADO-Anwendungen die Initialisierungseigenschaft SSPROP_INIT_DATATYPECOMPATIBILITY dem DBPROPSET_SQLSERVERDBINIT-Eigenschaftensatz hinzu, damit die neuen Datentypen in einer mit ADO kompatiblen Weise verfügbar gemacht werden. Überdies definiert der OLE DB-Anbieter von SQL Server Native Client ein neues Schlüsselwort für Verbindungszeichenwort namens DataTypeCompatibility, das in der Verbindungszeichenfolge festgelegt wird.

HinweisHinweis

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 OLE DB-Anbieter von SQL Server Native Client (SQLNCLI10) statt des SQLOLEDB-Anbieters verwenden, müssen Sie sicherstellen, dass das Schlüsselwort DataTypeCompatibility mit dem Wert "80" angegeben wird, damit die neuen Datentypen richtig den entsprechenden ADO-Datentypen 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 ihrer Verbindungszeichenfolge angeben:

  • Provider=SQLNCLI10

  • DataTypeCompatibility=80

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

Es folgt ein Beispiel, in dem eine ADO-Verbindungszeichenfolge eingerichtet wird, mit der die Verwendung von SQL Server Native Client in vollem Umfang ermöglicht und die MARS-Funktion aktiviert wird:

Dim con As New ADODB.Connection

con.ConnectionString = "Provider=SQLNCLI10;" _
         & "Server=(local);" _
         & "Database=AdventureWorks2008R2;" _ 
         & "Integrated Security=SSPI;" _
         & "DataTypeCompatibility=80;" _
         & "MARS Connection=True;"
con.Open

Beispiele

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

Abrufen von XML-Spaltendaten

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

Dim con As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim sXMLResult As String

con.ConnectionString = "Provider=SQLNCLI10;" _
         & "Server=(local);" _
         & "Database=AdventureWorks2008R2;" _ 
         & "Integrated Security=SSPI;" _ 
         & "DataTypeCompatibility=80;"

con.Open

' Get the xml data as a recordset.
Set rst.ActiveConnection = con
rst.Source = "SELECT AdditionalContactInfo FROM Person.Person " _
   & "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
HinweisHinweis

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=SQLNCLI10;" _
         & "Server=(local);" _
         & "Database=AdventureWorks2008R2;" _ 
         & "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 so eingerichtet, dass MARS über den OLE DB-Anbieter von SQL Server Native Client aktiviert wird, und dann werden zwei Recordset-Objekte erstellt, die über die gleiche Verbindung ausgeführt werden sollen.

Dim con As New ADODB.Connection

con.ConnectionString = "Provider=SQLNCLI10;" _
         & "Server=(local);" _
         & "Database=AdventureWorks2008R2;" _ 
         & "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 der OLE DB-Anbieter von SQL Server Native Client die MARS-Funktion verfügbar macht, sind mehrere aktive Resultsets in einer Verbindung zulässig.