Поделиться через


Использование ADO с собственным клиентом SQL Server

Для реализации новых возможностей SQL Server 2005, в частности, режима MARS, уведомлений о запросах, определяемых пользователем типов данных и нового типа данных xml, существующие приложения, использующие объекты ADO, должны в качестве поставщика доступа к данным использовать поставщик OLE DB для собственного клиента SQL Server.

Если применение новых функций SQL Server 2005 не требуется, то можно не использовать поставщик OLE DB для собственного клиента SQL Server, а продолжать работу с текущим поставщиком доступа к данным (обычно это SQLOLEDB). Если производится улучшение существующего приложения и необходимо задействовать новые функции SQL Server 2005, используйте поставщик OLE DB для собственного клиента SQL Server.

ПримечаниеПримечание

Если проектируется новое приложение, рекомендуется использовать ADO.NET и поставщик данных .NET Framework для SQL Server вместо собственного клиента SQL Server для доступа ко всем новым функциям недавно выпущенных версий SQL Server. Дополнительные сведения о поставщике данных .NET Framework для SQL Server см. в документации по пакету SDK платформы .NET Framework для ADO.NET.

Чтобы настроить ADO для использования новых возможностей недавно выпущенных версий SQL Server, были внесены некоторые улучшения в поставщик OLE DB для собственного клиента SQL Server, который расширяет базовую функциональность OLE DB. Эти улучшения позволяют приложениям ADO использовать новые возможности SQL Server и использовать два типа данных, введенных в SQL Server 2005: xml и udt. Эти улучшения также основаны на усовершенствованиях в типах данных varchar, nvarchar и varbinary. Собственный клиент для SQL Server добавляет свойство инициализации SSPROP_INIT_DATATYPECOMPATIBILITY к набору свойств DBPROPSET_SQLSERVERDBINIT для использования приложениями ADO, чтобы новые типы данных предоставлялись способом, совместимым с ADO. Кроме того, поставщик OLE DB для собственного клиента SQL Server также определяет новое ключевое слово строки соединения с именем DataTypeCompatibility, которое установлено в строке соединения.

ПримечаниеПримечание

Существующие приложения ADO могут обращаться и обновлять значения полей XML, определяемого пользователем типа, текстовые поля больших значений, и поля двоичных значений с использованием поставщика SQLOLEDB. Новые более крупны типы данных varchar(max), nvarchar(max) и varbinary(max) возвращаются как типы ADO adLongVarChar, adLongVarWChar и adLongVarBinary, соответственно. Столбцы XML возвращаются как adLongVarChar, а столбцы определяемого пользователем типа возвращаются как adVarBinary. Однако, если используется поставщик OLE DB для собственного клиента SQL Server (SQLNCLI10) вместо SQLOLEDB, нужно обязательно установить ключевое слово DataTypeCompatibility в значение «80», чтобы верно сопоставить новые типы данных типам данных ADO.

Включение собственного клиента SQL Server из ADO

Чтобы обеспечить использование собственного клиента SQL Server, приложениям ADO необходимо реализовать следующие ключевые слова в их строках соединения:

  • Provider=SQLNCLI10

  • DataTypeCompatibility=80

Дополнительные сведения о ключевых словах строки соединений ADO, поддерживаемых в собственном клиенте SQL Server, см. в разделе Использование ключевых слов строки соединения с собственным клиентом SQL Server.

Ниже приведен пример организации строки соединения ADO, полностью готовой для работы с собственным клиентом SQL Server, в том числе активации режима MARS.

Dim con As New ADODB.Connection

con.ConnectionString = "Provider=SQLNCLI10;" _
         & "Server=(local);" _
         & "Database=AdventureWorks;" _
          & "Integrated Security=SSPI;" _
         & "DataTypeCompatibility=80;" _
         & "MARS Connection=True;"
con.Open

Примеры

В следующем разделе приведены примеры использования ADO с поставщиком OLE DB для собственного клиента SQL Server.

Получение данных XML-столбца

В этом примере набор записей используется для извлечения и отображения данных из XML-столбца в образце базы данных SQL ServerAdventureWorks.

Dim con As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim sXMLResult As String

con.ConnectionString = "Provider=SQLNCLI10;" _
         & "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-столбцами не поддерживается. При использовании возвращается ошибка.

Получение данных столбца определяемого пользователем типа

В этом примере объект Command используется, чтобы выполнить запрос SQL, который возвращает определяемый пользователем тип, данные определяемого пользователем типа обновляются, а затем новые данные вставляются в базу данных. В этом примере предполагается, что определяемый пользователем тип Point был заранее зарегистрирован в базе данных.

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

В этом примере строка соединения конструируется, чтобы включить режим MARS через поставщик OLE DB для собственного клиента SQL Server, а затем создаются два объекта набора записей для выполнения с использованием того же соединения.

Dim con As New ADODB.Connection

con.ConnectionString = "Provider=SQLNCLI10;" _
         & "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, это привело бы к дополнительным издержкам. При предоставлении режима MARS поставщиком OLE DB для собственного клиента SQL Server получается несколько активных результатов на одном соединении.