搭配 SQL Server Native Client 使用 ADO

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)

重要

SQL Server Native Client (通常縮寫為 SNAC) 已從 SQL Server 2022 (16.x) 和 SQL Server Management Studio 19 (SSMS) 中移除。 不建議使用 SQL Server Native Client (SQLNCLI 或 SQLNCLI11) 和舊版 Microsoft OLE DB Provider for SQL Server (SQLOLEDB) 開發新的應用程式。 往後請改用新的 Microsoft OLE DB Driver (MSOLEDBSQL) for SQL Server 或最新的 Microsoft ODBC Driver for SQL Server。 如需 SQL Server 資料庫引擎元件隨附的 SQLNCLI(版本 2012 到 2019),請參閱此 支援生命週期例外狀況

為了利用 SQL Server 2005 (9.x) 中引進的新功能,例如多個使用中結果集 (MARS)、查詢通知、使用者定義型別 (UDT)或新的 xml 資料類型,使用 ActiveX Data Objects (ADO) 的現有應用程式應該使用 SQL Server Native Client OLE DB 提供者作為其資料存取提供者。

如果您不需要使用 SQL Server 2005 (9.x) 中引進的任何新功能,就不需要使用 SQL Server Native Client OLE DB 提供者;您可以繼續使用目前的資料存取提供者,通常是 SQLOLEDB。 如果您要增強現有的應用程式,而且需要使用 SQL Server 2005 (9.x) 中引進的新功能,您應該使用 SQL Server Native Client OLE DB 提供者。

注意

如果您要開發新的應用程式,建議您考慮使用 ADO.NET 和 .NET Framework Data Provider for SQL Server,而不是 SQL Server Native Client 來存取最新版 SQL Server 的所有新功能。 如需 .NET Framework Data Provider for SQL Server 的詳細資訊,請參閱適用于 ADO.NET 的 .NET Framework SDK 檔。

若要讓 ADO 能夠使用最新版 SQL Server 的新功能,已對 SQL Server Native Client OLE DB 提供者進行一些增強功能,以擴充 OLE DB 的核心功能。 這些增強功能可讓 ADO 應用程式使用較新的 SQL Server 功能,以及取用 SQL Server 2005 (9.x) 所導入的兩種資料類型:xmludt。 這些增強功能也會利用 varcharnvarcharvarbinary 資料類型的增強功能。 SQL Server Native Client 會將SSPROP_INIT_DATATYPECOMPATIBILITY初始化屬性新增至 ADO 應用程式使用DBPROPSET_SQLSERVERDBINIT屬性集,讓新的資料類型以與 ADO 相容的方式公開。 此外,SQL Server Native Client OLE DB 提供者也會定義名為 DataTypeCompatibility 的新連接字串關鍵字,該 關鍵字會在連接字串中設定。

注意

現有的 ADO 應用程式可以使用 SQLOLEDB 提供者來存取並更新 XML、UDT 和大數值文字與二進位欄位值。 新的較大 varchar(max)nvarchar(max)varbinary(max) 資料類型會分別傳回成 ADO 類型 adLongVarCharadLongVarWCharadLongVarBinary。 XML 資料行會傳回成 adLongVarChar,而且 UDT 資料行會傳回成 adVarBinary。 不過,如果您使用 SQL Server Native Client OLE DB 提供者 (SQLNCLI11) 而不是 SQLOLEDB,您必須確定將 DataTypeCompatibility 關鍵字設定 為 「80」,讓新的資料類型正確對應至 ADO 資料類型。

從 ADO 啟用 SQL Server Native Client

若要啟用 SQL Server Native Client 的使用方式,ADO 應用程式必須在連接字串中實作下列關鍵字:

  • Provider=SQLNCLI11

  • DataTypeCompatibility=80

如需 SQL Server Native Client 中支援的 ADO 連接字串關鍵字詳細資訊,請參閱 搭配 SQL Server Native Client 使用連接字串關鍵字。

以下是建立完全啟用以使用 SQL Server Native Client 的 ADO 連接字串的範例,包括啟用 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  

範例

下列各節提供如何搭配 SQL Server Native Client OLE DB 提供者使用 ADO 的範例。

擷取 XML 資料行資料

在這個範例中,使用了資料錄集來擷取並顯示 SQL Server AdventureWorks 範例資料庫中 XML 資料行的資料。

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  

注意

XML 資料行不支援資料錄集篩選。 如果已使用,就會傳回錯誤。

擷取 UDT 資料行資料

在這個範例中,使用了 Command 物件來執行可傳回 UDT 的 SQL 查詢、更新 UDT 資料,然後將新的資料插回資料庫中。 這個範例會假設已經在資料庫中註冊了 Point UDT。

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  

啟用和使用 MARS

在此範例中,連接字串會建構為透過 SQL Server Native Client OLE DB 提供者啟用 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  
  
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  

在舊版 OLE DB 提供者中,此程式碼會導致系統在第二次執行時建立隱含連接,因為每個單一連接只能開啟一個作用中結果集。 因為隱含連接未集區于 OLE DB 連線集區中,這會造成額外的額外負荷。 透過 SQL Server Native Client OLE DB 提供者公開的 MARS 功能,您會在一個連線上取得多個作用中結果。

另請參閱

使用 SQL Server Native Client 建置應用程式