Использование 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=AdventureWorks2008R2;" _ 
         & "Integrated Security=SSPI;" _
         & "DataTypeCompatibility=80;" _
         & "MARS Connection=True;"
con.Open

Примеры

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

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

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

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-столбцов не поддерживается. При попытке ее использования возвращается ошибка.

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

В этом примере объект 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=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

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

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, это вызывало дополнительные издержки. Когда поставщик OLE DB для собственного клиента SQL Server обеспечивает поддержку режима MARS, в одном соединении может быть несколько активных наборов результатов.