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


Использование объектов ADO с драйвером OLE DB для SQL Server

Применимо: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure azure Synapse Analytics Analytics Platform System (PDW)

Скачать драйвер OLE DB

Чтобы воспользоваться преимуществами новых функций, представленных в SQL Server 2005 (9.x), таких как несколько активных результирующих наборов (MARS), уведомлений запросов, определяемых пользователем типов (определяемых пользователем типов) или нового типа данных XML , существующие приложения, использующие объекты данных ActiveX (ADO), должны использовать драйвер OLE DB для SQL Server в качестве поставщика доступа к данным.

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

Примечание.

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

Установка OLE DB Driver for SQL Server из ADO

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

  • Provider=MSOLEDBSQL19

  • DataTypeCompatibility=80

См. подробнее об использовании ключевых слов строки подключения с OLE DB Driver for SQL Server.

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

Dim con As New ADODB.Connection

con.ConnectionString = "Provider=MSOLEDBSQL19;" _
         & "Server=(local);" _
         & "Database=AdventureWorks;" _
         & "Use Encryption for Data=Optional;" _
         & "Integrated Security=SSPI;" _
         & "DataTypeCompatibility=80;" _
         & "MARS Connection=True;"
con.Open

Примеры

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

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

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

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

con.ConnectionString = "Provider=MSOLEDBSQL19;" _
         & "Server=(local);" _
         & "Database=AdventureWorks;" _
         & "Use Encryption for Data=Optional;" _
         & "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 используется для выполнения запроса 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=MSOLEDBSQL19;" _
         & "Server=(local);" _
         & "Database=AdventureWorks;" _
         & "Use Encryption for Data=Optional;" _
         & "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=MSOLEDBSQL19;" _
         & "Server=(local);" _
         & "Database=AdventureWorks;" _
         & "Use Encryption for Data=Optional;" _
         & "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, в одном соединении может быть несколько активных результатов.

См. также

Создание приложений с помощью драйвера OLE DB для SQL Server