Работа с данными из удаленных источников
В лекциях 6-7 курса "Разработка и защита баз данных в Microsoft SQL Server 2005" вы научились переносить локальные данные на удаленные серверы баз данных, использовать разные варианты репликации, которые предлагает SQL Server 2005 и применять службы интеграции SQL Server для взаимодействия с различными источниками данных.
В реальных приложениях приходится работать с данными из различных удаленных источников; не всегда можно или желательно настроить схему репликации - иногда вам просто нужно выполнить единственный запрос, чтобы извлечь информацию в режиме реального времени, не ожидая реплицированных данных.
В этой лекции мы сконцентрируемся на том, как читать данные с удаленных источников и как осуществлять запись на удаленные источники данных в режиме реального времени. Этими источниками данных могут быть либо другие экземпляры SQL Server, либо иные источники данных, например, файлы Microsoft Office Excel или Microsoft Exchange Server.
Если нужно выполнить чтение данных на удаленном источнике данных, необходим способ объявить источник данных назначения, с которым вы хотите связаться и с которого нужно получить данные.
В приложении, которое соединяется с одним сервером базы данных, это обычно реализуется при помощи класса ADO.NET Connection. В этой лекции рассказывается, главным образом, об установлении соединения с удаленным источником данных из SQL Server при помощи кода T-SQL при недоступности ADO.NET.
Чтение данных с удаленных источников в среднем ярусе
Давайте ненадолго вернемся к применению ADO.NET. Чтобы читать данные на удаленных источниках из компонента среднего яруса, вам необходимо открыть объект Connection для каждого из различных источников данных, с которыми вы хотите связаться, и независимо запросить у каждого из них данные, которые нужно извлечь.
Как показано на рис. 4.1, при таком подходе коду среднего яруса приходится выполнять запросы к каждому из этих различных источников данных, используя API доступа каждого источника и выполняя слияние собранных результатов в общий результирующий набор.
Чтение данных с удаленных источников в среднем ярусе с использованием ADO.NET
Приложение среднего яруса должно установить соединение с каждым из различных источников данных при помощи соответствующего поставщика доступа к данным. Например:
- Чтобы подключиться к базе данных Oracle при помощи ADO.NET:
"Connect to pacific sales Dim oracleConn As OracleConnection = New OracleConnection() oracleConn.ConnectionString = "Data Source=MyOracleDB;Integrated Security=yes" Dim oracleDA As New OracleDataAdapter("SELECT * FROM PacificSales", oracleConn)
- Чтобы подключиться к файлу Excel при помощи ADO.NET:
"Connect to central sales Dim excelConn As New OleDbConnection() excelConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" &_ "Data Source=C:\CentralSales.xls;Extended Properties=""Excel 8.0""" Dim excelDA As New OleDbDataAdapter("SELECT * FROM [Sales$]", excelConn)
- Чтобы подключиться к базе данных SQL Server при помощи ADO.NET:
"Connect to atlantic sales Dim sqlConn As New SqlConnection() sqlConn.ConnectionString = "Data Source=MySQLServer; Initial Catalog=MySQLDB; Integrated Security=SSPI" Dim sqlDA As New SqlDataAdapter("SELECT * FROM AtlanticSales", sqlConn)
Затем приложение среднего яруса должно использовать объект DataSet для хранения всех данных, поступивших от различных источников, как в следующем примере кода: (Код этого раздела можно найти среди файлов примеров под именем MiddleTier.vb.txt ).
Dim salesData as New DataSet() oracleDA.Fill(salesData) excelDA.Fill(salesData) sqlDA.Fill(salesData)
Обобщаем: при реализации удаленного доступа в среднем ярусе каждый раз, когда необходимы данные о продажах, приложению нужно выполнить следующие действия:
- Открыть отдельное соединение для каждого удаленного источника данных.
- Перенести данные в средний ярус и слить все результаты в общий результат.
Среднему ярусу приходится иметь дело с фактом распределения данных по различным физическим местам хранения.
Иногда слияние данных в среднем ярусе оказывается не такой простой операцией, как в этом примере, поскольку данные могут быть по разному представлены и отформатированы. Код, необходимый для манипуляций с разнородными источниками данных, в программировании в инфраструктуре .NET не всегда одинаков. Например, если нужно извлечь данные из текстового файла, вероятно, вы воспользовались бы классом в пространстве имен System.IO, но если данные нужно было бы извлечь из Active Directory, то, скорее, потребовался бы класс в пространстве имен System.DirectoryServices. Модели программирования для классов в этих пространствах имен весьма различны.
Чтение данных из удаленных источников в SQL Server
Еще один возможный подход в среднем ярусе - это запрос представлений, созданных в SQL Server. Представление должно отвечать за коммуникации со всеми разными источниками данных, выполняя слияние результатов и предоставляя вызывающему приложению один результирующий набор.
Как показано на рис. 4.2, если мы перенесем ответственность за слияние результатов на SQL Server, то сможем воспользоваться преимуществами следующих аспектов:
- Не нужно объединять средний ярус с физической реализацией.
- SQL Server может выдать один результирующий набор, независимо от физического распределения данных, поэтому коду среднего яруса гораздо проще осуществлять запись, при этом риск в отношении безопасности, обслуживания, параллельного управления и коммуникаций будет меньше.
- Обрабатывая промежуточные результирующие наборы от каждого из различных источников данных в SQL Server, мы можем воспользоваться реляционным поисковым механизмом и конструкциями T-SQL для того, чтобы создать более простое, легкое и управляемое решение (см. рис. вверху следующей страницы).
SQL Server 2005 предлагает два разных подхода к управлению соединениями с удаленными источниками данных:
- Установление нерегламентируемых соединений с внешними источниками данных, или
- Статичное управление информацией о конфигурации соединения посредством установки связанного сервера.
Оба подхода требуют, чтобы удаленный источник данных поддерживал поставщики доступа к данным OLE DB. Это означает, что вы могли бы установить соединение с другими базами данных SQL Server, файловой системы Windows, Microsoft Exchange Server, Windows Active Directory Service, Microsoft Excel или любых других источников данных с поставщиком OLE DB.
Читаем данные из удаленного источника данных с использованием нерегламентированных запросов
Нерегламентируемые запросы обеспечивают возможность установить соединение с удаленным источником данных и выполнить к нему запрос из кода T-SQL. Это разовое соединение функционирует только в течение выполняемой в данный момент операции.
Включение поддержки нерегламентированных запросов
В SQL Server 2005 поддержка нерегламентированных запросов по умолчанию отключена в интересах безопасности. Выполните перечисленные ниже действия, чтобы применить хранимую процедуру sp_configure для настройки поддержки нерегламентированных запросов или следующую процедуру для выполнения той же задачи через средство SQL Server Surface Area Configuration (Настройка конфигурации контактной зоны SQL Server).
Включаем поддержку нерегламентированных запросов с помощью T-SQL
- В меню Start (Пуск) выберите All Programs,. Microsoft SQL Server 2005, SQL Server Management Studio (Все программы, Microsoft SQL Server 2005, Среда SQL Server Management Studio). Откройте окно нового запроса и введите следующий код (который можно найти среди файлов примеров под именем EnableAdHoc.sql в папке SqlScripts.
sp_configure "show advanced options", 1; GO RECONFIGURE; GO sp_configure "Ad Hoc Distributed Queries", 1; GO RECONFIGURE; GO
- Нажмите кнопку Execute (Выполнить).
Включаем поддержку нерегламентированных запросов при помощи средства Настройка конфигурации контактной зоны SQL Server
- В меню Start (Пуск) выберите All Programs,. Microsoft SQL Server 2005, Configuration Tools, SQL Server Surface Area Configuration. (Все программы, Microsoft SQL Server 2005, Средства настройки, Настройка контактной зоны SQL Server).
- В нижней части главного окна, показанного на следующем рисунке, щелкните ссылку Surface Area Configuration For Features (Настройка контактной зоны для функциональных возможностей).
- В окне Surface Area Configuration For Feature (Настройка контактной зоны для функциональных возможностей) перейдите на расположенную слева вкладку View By Instance (Просмотр по экземплярам).
- Выделите экземпляр SQL Server, который нужно сконфигурировать, и разверните дерево Database Engine.
- Выберите пункт Ad Hoc Remote Queries (Нерегламентированные удаленные запросы) в левой части окна.
- Установите флажок Enable OPENROWSET And OPENDATASOURCE Support (Включить поддержку функций OPENROWSET и OPENDATASOURCE ).