Korzystanie z ADO z natywnym klientem SQL Server

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Ważna

Klient natywny SQL Servera (SNAC) nie jest dostarczany z:

  • SQL Server 2022 (16.x) i nowsze wersje
  • SQL Server Management Studio 19 i nowsze wersje

Program SQL Server Native Client (SQLNCLI lub SQLNCLI11) oraz starszy dostawca microsoft OLE DB dla programu SQL Server (SQLOLEDB) nie są zalecane w przypadku tworzenia nowych aplikacji.

W przypadku nowych projektów użyj jednego z następujących sterowników:

W przypadku programu SQLNCLI dostarczanego jako składnik aparatu bazy danych programu SQL Server (wersje 2012–2019), proszę sprawdzić wyjątek cyklu wsparcia .

Aby skorzystać z nowych funkcji wprowadzonych w SQL Server 2005 (9.x), takich jak wiele aktywnych zestawów wyników (MARS), powiadomienia o zapytaniach, typy zdefiniowane przez użytkownika (UDT) czy nowy typ danych xml, istniejące aplikacje korzystające z ActiveX Data Objects (ADO) powinny korzystać z dostawcy natywnej klientowej bazy danych SQL Server jako dostawcy dostępu do danych.

Jeśli nie musisz korzystać z nowych funkcji wprowadzonych w SQL Server 2005 (9.x), nie musisz korzystać z dostawcy SQL Server Native Client OLE DB; możesz nadal korzystać z obecnego dostawcy dostępu do danych, którym jest zazwyczaj SQLOLEDB. Jeśli ulepszasz istniejącą aplikację i potrzebujesz korzystać z nowych funkcji wprowadzonych w SQL Server 2005 (9.x), powinieneś skorzystać z dostawcy SQL Server Native Client OLE DB.

Uwaga / Notatka

Jeśli tworzysz nową aplikację, zaleca się rozważenie korzystania z ADO.NET oraz .NET Framework Dostawca danych for SQL Server zamiast SQL Server Native Client, aby uzyskać dostęp do wszystkich nowych funkcji najnowszych wersji SQL Server. Aby uzyskać więcej informacji o .NET Framework Dostawca danych for SQL Server, zobacz dokumentację .NET Framework SDK dla ADO.NET.

Aby umożliwić ADO korzystanie z nowych funkcji najnowszych wersji SQL Server, wprowadzono pewne ulepszenia w dostawcy SQL Server Native Client OLE DB, rozszerzając podstawowe funkcje OLE DB. Te ulepszenia pozwalają aplikacjom ADO korzystać z nowszych funkcji SQL Server oraz korzystać z dwóch typów danych wprowadzonych w SQL Server 2005 (9.x): xml i udt. Te ulepszenia wykorzystują również ulepszenia do typów danych varchar, nvarchar i varbinary . SQL Server Natywny Klient dodaje właściwość inicjalizacji SSPROP_INIT_DATATYPECOMPATIBILITY do zestawu właściwości DBPROPSET_SQLSERVERDBINIT do użytku przez aplikacje ADO, aby nowe typy danych były udostępniane w sposób zgodny z ADO. Dodatkowo, dostawca SQL Server Native Client OLE DB definiuje nowe słowo kluczowe parametry połączenia o nazwie DataTypeCompatibility (DataTypeCompatiable), które jest ustawiane w parametry połączenia.

Uwaga / Notatka

Istniejące aplikacje ADO mogą uzyskać dostęp i aktualizować XML, UDT oraz tekstowe i binarne wartości z dużą wartością za pomocą dostawcy SQLOLEDB. Nowe, większe typy danych varchar(max),nvarchar(max) i varbinary(max) zwracane są jako typy ADO adLongVarChar, adLongVarWChar i adLongVarBinary odpowiednio. Kolumny XML zwracane są jako adLongVarChar, a kolumny UDT jako adVarBinary. Jednak jeśli używasz dostawcy SQL Server Native Client OLE DB (SQLNCLI11) zamiast SQLOLEDB, musisz ustawić słowo kluczowe DataTypeCompatibility na "80", aby nowe typy danych poprawnie odpowiadały typom danych ADO.

Włączanie natywnego klienta SQL Server z ADO

Aby umożliwić korzystanie z natywnego klienta SQL Server, aplikacje ADO będą musiały zaimplementować następujące słowa kluczowe w swoich łańcuchach połączeń:

  • Provider=SQLNCLI11

  • DataTypeCompatibility=80

Aby uzyskać więcej informacji o słowach kluczowych ADO connections obsługiwanych w SQL Server Native Client, zobacz Using Connection String Keywords with SQL Server Native Client.

Poniżej znajduje się przykład ustanowienia parametry połączenia ADO, który jest w pełni włączony do pracy z natywnym klientem SQL Server, włączając funkcję 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  

Examples

Poniższe sekcje przedstawiają przykłady, jak można używać ADO z dostawcą SQL Server Native Client OLE DB.

Pobieranie danych kolumn XML

W tym przykładzie zestaw rekordów służy do pobierania i wyświetlania danych z kolumny XML w przykładowej bazie SQL Server AdventureWorks .

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  

Uwaga / Notatka

Filtrowanie zbiorów rekordów nie jest obsługiwane przez kolumny XML. Jeśli zostanie użyty, zostanie zwrócony błąd.

Pobieranie danych kolumnowych UDT

W tym przykładzie obiekt Command służy do wykonania zapytania SQL, które zwraca UDT, dane UDT są aktualizowane, a następnie nowe dane są wstawiane z powrotem do bazy danych. Ten przykład zakłada, że punktowy UDT został już zarejestrowany w bazie danych.

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  

Włączanie i korzystanie z MARS

W tym przykładzie parametry połączenia jest konstruowany tak, aby umożliwić MARS przez dostawcę SQL Server Native Client OLE DB, a następnie tworzone są dwa obiekty rekordów do wykonania przy użyciu tego samego połączenia.

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  

W poprzednich wersjach dostawcy OLE DB ten kod powodował utworzenie połączenia domyślnego przy drugim wykonaniu, ponieważ na jedno połączenie można było otworzyć tylko jeden aktywny zestaw wyników. Ponieważ połączenie niejawne nie było zgrupowane w puli połączeń OLE DB, powodowało to dodatkowe narzuty. Dzięki funkcji MARS udostępnionej przez natywnego klienta OLE DB SQL Server, otrzymujesz wiele aktywnych wyników na jednym połączeniu.