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


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

Чтобы воспользоваться преимуществами новых функций, появившихся в SQL Server 2005 г., таких как несколько активных результирующих наборов (MARS), уведомления о запросах, определяемые пользователем типы (определяемые пользователем типы) или новый тип данных xml, существующие приложения, использующие объекты данных ActiveX (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.

Примечание

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

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

Примечание

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

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

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

  • Provider=SQLNCLI11

  • DataTypeCompatibility=80

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

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

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

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

В этом примере объект 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=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 через поставщик SQL SERVER NATIVE CLIENT OLE DB, а затем создаются два объекта набора записей для выполнения с использованием одного и того же соединения.

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, предоставляемой поставщиком SQL SERVER NATIVE CLIENT OLE DB, вы получите несколько активных результатов для одного подключения.

См. также:

Построение приложений с использованием SQL Server Native Client