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


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

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

Если вам не нужно использовать какие-либо новые функции, представленные в 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 Native Client добавляет свойство инициализации SSPROP_INIT_DATATYPECOMPATIBILITY в набор свойств DBPROPSET_SQLSERVERDBINIT для использования приложениями ADO, чтобы новые типы данных были доступны таким образом, чтобы они были совместимы с ADO. Кроме того, поставщик OLE DB собственного клиента SQL Server также определяет новое ключевое слово строки подключения, заданное DataTypeCompatibility в строке подключения.

Замечание

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

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

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

  • Provider=SQLNCLI11

  • DataTypeCompatibility=80

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

Ниже приведен пример создания строки подключения ADO, которая полностью включена для работы с собственным клиентом SQL Server, включая включение функции 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 с поставщиком OLE DB собственного клиента 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=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 используется для выполнения SQL-запроса, возвращающего определяемый пользователем объект, обновляется данные UDT, а затем новые данные вставляются обратно в базу данных. В этом примере предполагается, что точка 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

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

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

См. также

Создание приложений с помощью собственного клиента SQL Server