将 ADO 用于 SQL Server Native Client

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

重要

已从 SQL Server 2022 (16.x) 和 SQL Server Management Studio 19 (SSMS) 中删除SQL Server Native Client(通常缩写为 SNAC)。 不建议在新应用程序开发工作中使用 SQL Server Native Client(SQLNCLI 或 SQLNCLI11)和旧版 Microsoft OLE DB Provider for SQL Server (SQLOLEDB)。 请在此后切换为使用新版 Microsoft OLE DB Driver (MSOLEDBSQL) for SQL Server 或最新版的 Microsoft OLE DB Driver for SQL Server。 对于作为 SQL Server 数据库引擎组件随附的 SQLNCLI (版本 2012 到 2019) ,请参阅此支持生命周期异常

为了利用 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的新功能,对SQL Server Native Client OLE DB 访问接口进行了一些增强,该提供程序扩展了 OLE DB 的核心功能。 借助这些增强功能,ADO 应用程序可使用更新的 SQL Server 功能,还可使用 SQL Server 2005 (9.x) 中引入的两个数据类型(xml 和 udt) 。 通过这些增强功能,还可探索对 varchar、nvarchar 和 varbinary 数据类型的强化 。 SQL Server Native Client将 SSPROP_INIT_DATATYPECOMPATIBILITY 初始化属性添加到 DBPROPSET_SQLSERVERDBINIT 属性集以供 ADO 应用程序使用,以便以与 ADO 兼容的方式公开新的数据类型。 此外,SQL Server Native Client OLE DB 访问接口还定义一个新的连接字符串,关键字 (keyword) 在连接字符串中设置名为 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 关键字 (keyword) 设置为“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 生成应用程序