将 ADO 用于 SQL Server Native Client

为了利用在 SQL Server 2005 中引入的新功能,比如多个活动结果集 (MARS)、查询通知、用户定义类型 (UDT) 或新的 xml 数据类型,那些使用 ActiveX Data Objects (ADO) 的现有应用程序应当使用 SQL Server Native Client OLE DB 访问接口作为其数据访问接口。

如果不需要使用在 SQL Server 2005 中引入的任何新功能,则不需要使用 SQL Server Native Client OLE DB 访问接口;您可以继续使用当前数据访问接口(通常是 SQLOLEDB)。如果要增强现有应用程序的功能,并且需要使用在 SQL Server 2005 中引入的新功能,则应当使用 SQL Server Native Client OLE DB 访问接口。

注意注意

如果要开发新的应用程序,则建议考虑使用用于 SQL Server 的 ADO.NET 和 .NET Framework 数据访问接口,而不是使用 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 中引入的两个数据类型:xmludt。这些增强还可以利用对 varcharnvarcharvarbinary 数据类型的增强。SQL Server Native Client 将 SSPROP_INIT_DATATYPECOMPATIBILITY 初始化属性添加到 DBPROPSET_SQLSERVERDBINIT 属性集,供 ADO 应用程序使用,以便以与 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 访问接口 (SQLNCLI10) 而不是 SQLOLEDB,则需要确保将 DataTypeCompatibility 关键字设置为“80”,以便新数据类型能正确映射到 ADO 数据类型。

从 ADO 启用 SQL Server Native Client

若要能够使用 SQL Server Native Client,ADO 应用程序需要在其连接字符串中实现以下关键字:

  • Provider=SQLNCLI10

  • 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=SQLNCLI10;" _
         & "Server=(local);" _
         & "Database=AdventureWorks2008R2;" _ 
         & "Integrated Security=SSPI;" _
         & "DataTypeCompatibility=80;" _
         & "MARS Connection=True;"
con.Open

示例

以下几节提供的示例演示如何对 SQL Server Native Client OLE DB 访问接口使用 ADO。

检索 XML 列数据

在此示例中,使用记录集从 AdventureWorks2008R2 示例数据库中的 XML 列检索并显示数据。

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
注意注意

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=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

启用和使用 MARS

在该示例中,将构造连接字符串以便通过 SQL Server Native Client OLE DB 访问接口启用 MARS,然后创建两个将使用相同连接执行的记录集对象。

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

在以前的 OLE DB 访问接口版本中,该代码会导致在第二次执行时创建隐式的连接,因为每个单独的连接只能打开一个活动的结果集。由于该隐式连接未加入 OLE DB 连接池,因此这会导致额外的开销。使用由 SQL Server Native Client OLE DB 访问接口提供的 MARS 功能,可以在一个连接上获得多个活动结果。