将 ADO 用于 SQL Server Native Client

适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW)

重要

SQL Server Native Client (SNAC) 未随附:

  • SQL Server 2022 (16.x) 及更高版本
  • SQL Server Management Studio 19 及更高版本

不建议使用 SQL Server Native Client(SQLNCLI 或 SQLNCLI11)和旧的 Microsoft OLE DB Provider for SQL Server (SQLOLEDB)进行新的应用程序开发。

对于新项目,请使用以下驱动程序之一:

对于作为 SQL Server 数据库引擎组件(版本 2012 到 2019)随附的 SQLNCLI,请参阅此支持生命周期特例

为了利用 SQL Server 2005(9.x)中引入的新功能,例如多个活动结果集(MARS)、查询通知、用户定义的类型(UDT)或新的 xml 数据类型,使用 ActiveX 数据对象(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 和适用于 SQL Server 的 .NET Framework 数据提供程序,而不是 SQL Server Native Client 来访问最新版本的 SQL Server 的所有新功能。 有关适用于 SQL Server 的 .NET Framework 数据提供程序的详细信息,请参阅适用于 ADO.NET 的 .NET Framework SDK 文档。

若要使 ADO 能够使用最新版本的 SQL Server 新功能,已对扩展 OLE DB 核心功能的 SQL Server Native Client OLE DB 访问接口进行了一些增强。 借助这些增强功能,ADO 应用程序可使用更新的 SQL Server 功能,还可使用 SQL Server 2005 (9.x) 中引入的两个数据类型(xml 和 udt) 。 通过这些增强功能,还可探索对 varchar、nvarchar 和 varbinary 数据类型的强化 。 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 类型 adLongVarChar、adLongVarWChar 和 adLongVarBinary 返回 。 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 配合使用。

下面是建立完全启用的 ADO 连接字符串以使用 SQL Server Native Client(包括启用 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  

示例

以下部分提供了如何将 ADO 与 SQL Server Native Client OLE DB 提供程序配合使用的示例。

检索 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 生成应用程序