ADO.NET: Обзор технологии

ОГЛАВЛЕНИЕ

Многие программисты, работающие с базами данных на платформах Microsoft, могли оценить простоту и удобство технологии ADO - ActiveX Data Objects. Интутитивно-понятный интерфейс и логичный набор объектов вместе с простотой программирования заслуженно получили признание программистов. Несмотря на это, вместе с новой платформой .NET  Microsoft представляет и новое поколение средств доступа к базам данных - ADO.NET.

Cтремительное развитие веб приложений вызвало необходимость пересмотреть методы работы с источниками данных, лучше адаптировать их к специфики приложений. Непредсказуемый рост числа клиентов интернет сайтов заставляет разработчиков переходить от клиентсерверной к three-tier архитектуре, что часто порождает непреодолимые проблемы. Базы данных не способны поддерживать неограниченное число активных соединений, ограничивая доступность сайта и принося убытки. Брандмауэры могут препятствовать передаче двоичных данных между узлами. ADO.NET призвано решить эти и другие проблемы и вместе с тем сохранить удобство и простоту программирования.


Преимущества и нововведения в ADO.NET

Использование разъединенной модели доступа к данным.

В клиент-серверных приложениях традиционно используется технология доступа к источнику данных при которой соединение с базой поддерживается постоянно. Однако после широкого распространения приложений, ориентированных на Интернет, выявились некоторые недостатки такого подхода. Попробуем выявить некоторые из них.

Соединения с базой данных требуют выделения системных ресурсов, что может быть критично при большой нагрузке сервера. Хотя постоянное соединение позволяет несколько ускорить работу приложения, общий убыток от растраты системных ресурсов сводит преимущество на нет.

Специфика веб приложений не позволяет серверу в каждый момент времени знать, что необходимо пользователю. То есть до следующего запроса сервер не имеет представления, нужно ли еще поддерживать соединение.

Опыт разработчиков показал, что приложения с постоянным соединением с источником данных черезвычайно трудно поддаются масштабированию.

Хотя существуют и другие недостатки, приведенные, на мой взгляд, наиболее существенны и вероятнее всего встречались читателю. Все эти проблемы порождаются постоянным соединением с базой данных и решаются в ADO.NET, где используется другая модель доступа. Теперь соединение устанавливается лишь на то короткое время, когда необходимо проводить операции над базой данных.

Следует признать, что новая технология иногда все же проигрывает традиционной. Для этих случаев рекомендовано (не только мною, но и Microsoft) использовать ADO. Примерами таких приложений служат програмы проводящие частые и объемные изменения содержания записей - заказ билетов, например (подробнее о причинах непригодности разъединенной модели в этом случае см. следующий раздел).

Хранение данных в объектах DataSet.

При работе с базой данных нам чаще всего приходится работать не с одной, а несколькими записями. Более того, данные эти могут собираться из различных таблиц. В разъединенной модели доступа к базе данных не имеет смысла соединяться и источником данных при каждом обращении. Исходя из этого, представляется логичным хранить несколько строк и обращаться к ним при необходимости. Для этих целей и используется DataSet.

DataSet представляет собой, по сути, упрощенную реляционную базу данных и может выполнять наиболее типичные для таких баз данных операции. Теперь, в отличие от Recordset мы можем хранить в одном DataSet сразу несколько таблиц, связи между ними, выполнять операции выборки, удаления и обновления данных. Безусловно, разъединенная модель не позволяет постоянно отслеживать изменения в базе данных, производимые другими пользователями. Это может привести к ошибкам в таких приложениях, где информация должна обновляться каждый момент - заказ билетов или продажа ценных бумаг. Однако в любую секунду может быть получена свежая информация из базы данных через вызов метода FillDataSet. Таким образом, DataSet остается черезвычайно удобным для самого широкого класса приложений: когда необходимо получить данные из базы и как-либо обработать их.    

Подробнее DataSet и его программирование мы рассмотрим в разделе статьи, посвященном практическому применению ADO.NET.

Глубокая интеграция с XML.

Все более широко распространяющийся XML играет важнейшую роль в ADO.NET и приносит еще несколько преимуществ по сравнению с традиционным подходом.

Заметим для начала, что практически любой XML файл может быть использован как источник данных и на его основе может быть создан DataSet. точно также при передаче данных между компонентами или сохранении их в файл используется XML.

Программист, работающий с ADO.NET не обязательно должен иметь опыт работы с XML или познания в этом языке. Все операции остаются прозрачными для разработчика.

Так как XML имеет текстовое представление, это позволяет передавать его по протоколам типа HTTP через брандмауэры. Дело в том, что системы защиты обычно настроены на фильтрацию двоичной информации, текстовая же легко пропускается, что облегчает создание распределенных приложений.

XML представляет собой промышленный стандарт, поддерживаемый практически любой современной платформой, что позволяет передавать данные любому компоненту, умеющему работать с XML, и выполняющемуся под любой операционной системой.

При передачи больших объемов информации через COM возникает проблема приведения типов данных, так как COM поддерживает лишь ограниченный их набор. Действительно, COM маршаллинг может требовать длительной обработки, что негативно сказывается на производительности приложения. XML же поддерживает неограниченное число типов и не требует их конверсии, что позволит ускорить процесс передачи данных.


 

Практическое применение ADO.NET

Введение.

Умение применить на практике теоритические знания преумножает их цену, поэтому мы посвящаем примерам работы с ADO.NET отдельный раздел, где рассмотрим наиболее типичные задачи, разбив их на отдельные блоки: соединение с источником данных, выборка, удаление и обновление информации, вывод содержимого на экран, работа с XML и т.д. В качестве платформы для построения интерфейса будет использована ASP.NET, а как язык программирования взят C#. 

Managed Providers.

ADO.NET поддерживает два типа источников данных - SQL Managed Provider и ADO Managed Provider. SQL Managed Provider применяется для работы с Microsoft SQL Server 7.0 и выше, ADO Managed Provider - для всех остальных баз данных.

SQL Managed Provider - работает по специальному протоколу, называемому TabularData Stream (TDS) и не использует ни ADO, ни ODBC, ни какую-либо еще технологию. Ориентированный специально на MS SQL Server, протокол позволяет увеличить скорость передачи данных и тем самым повысить общую производительность приложения.

ADO Managed Provider - предназначен для работы с произвольной базой данных. Однако за счет универсальности есть проигрыш по сравнению с SQL Server Provider, так что при работе с SQL Server рекомендовано использовать специализированные классы. В данном обзоре мы коснемся ADO Managed Provider лишь мельком, указав только существующие незначительные различия, так как наиболее употребимой базой данных представляется SQL Server 7.0 или 2000,  а разница заключается, в основном, в именовании.

Для работы с нашими примерами вам понадобится создать базу данных dotSITE и выполнить следующие скрипты для создания структуры и минимального наполнения. 

if exists (select * from sysobjects where id = object_id(N'[dbo].[Articles]') and 
OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Articles]GOif exists (
select * from sysobjects where id = object_id(N'[dbo].[Authors]') and
OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Authors]GO
CREATE TABLE [dbo].[Articles] ( [Theme] [char] (50) NOT NULL ,    
 [Author] [int] NULL ) ON [PRIMARY]GO
CREATE TABLE [dbo].[Authors] ( 
[AuthorID] [int] IDENTITY (1, 1) NOT NULL , 
[Name] [char] (50) NULL ,
[SirName] [char] (50) NULL ) ON
[PRIMARY]GO
insert into Authors(Name,SirName) values ('Michael','Kondratiev')
insert into Authors(Name,SirName) values ('Andrew','Filev')
insert into Authors(Name,SirName) values ('Alex','Utkin')
insert into Articles(AuthorID,Theme) values (1,'ASPNET Authentication')
insert into Articles(AuthorID,Theme) values (2,'ASPNET Overview')
insert into Articles(AuthorID,Theme) values (3,'Soap')

Теперь, когда мы создали базу данных, можно переходить непосредственно к примерам. Во всех случаях, кроме особо оговоренных будет использоваться SQL Managed Provider. 

Установление соединения с базой данных:

Чтобы установить соединение с нашейбазой данных следует выполнить следующий код:

SQLConnectionmyConnection=
newSQLConnection("server=localhost;uid=sa;pwd=;database= dotSITE");
myConnection.Open();
Как видно, при использовании SQL Managed Provider не указывается DSN. Для работы с произвольной базой данных строка соединения указыается как в ADO. В этом случае используются ADO ориентированные классы: ADOConnection, ADOCommand, ADODataReaderи др.

Важно! Не забудьте импортировать соответствующие пространства имен в зависимости от используемого Managed Provider. В ASP.NET это будет выглядеть:

<% 'ДЛЯ ADO Managed Provider %><%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.ADO" %><% 'ДЛЯ SQL Managed Provider %>
<%@ Import Namespace="System.Data" %><%@ Import Namespace="System.Data.SQL" %>

Выборка, удаление и обновление данных:

Для выполнения операций над базой данных используется класс SQLConnection. При его создании мы передаем строку, содержащую SQL скрипт и имя соединения. В нашем случае это будет:

ADOCommand myCommand = new ADOCommand("select * from Authors", myConnection);
После этого, если это операция выборки можно использовать Dataset для передачи в него данных:
DataSet ds = new DataSet();myCommand.FillDataSet(ds, "Authors");
Если же производилось удаление, обновление или вставка, то используется метод ExecuteNonQuery(). При этом также нужно открыть, а после выполнения действий закрыть соединение. Следующий фрагмент кода иллюстриркет это:
myCommand.ActiveConnection.Open();
myCommand.ExecuteNonQuery();
myCommand.ActiveConnection.Close();
Теперь соберем все это вместе и продемонстрируем пример aspx страницы, выводящей на экран содержимое нашей базы данных. При этом используется серверный контрол DataGrid:
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SQL"%><html>
<script language="C#"runat="server">  
protected void Page_Load(ObjectSrc,EventArgsE){
SQLConnectionmyConnection=
newSQLConnection("server=localhost;uid=sa;pwd=;database=dotSITE");
SQLDataSetCommand myCommand = 
new SQLDataSetCommand("select * from Authors", myConnection);
DataSet ds = new DataSet();  
myCommand.FillDataSet(ds, "Authors");
MyDataGrid.DataSource=ds.Tables["Authors"].DefaultView;  
MyDataGrid.DataBind(); }</script><body>
<h3>  <font face="Verdana">  Вывод результатов выборки на экран</font></h3>  
<ASP:DataGrid id="MyDataGrid" runat="server"
Width="700" BackColor="red" BorderColor="black"
ShowFooter="false"  
CellPadding=3
CellSpacing="0"
Font-Name="Verdana"
Font-Size="8pt"
HeaderStyle-BackColor="green" MaintainState="false"  /></body></html>
Последнее, что еще не было продемонстрировано - заполнение DataSet из XML файла:
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Data" %>
<html><script language="C#" runat="server"> 
protected void Page_Load(Object Src, EventArgs E){
DataSet ds = new DataSet(); 
FileStream fstream = newFileStream(
Server.MapPath("XMLData.xml"),FileMode.Open,FileAccess.Read);
StreamReader STRreader = new StreamReader(fstream); 
ds.ReadXml(STRreader); 
fstream.Close(); 
DataView Source = new DataView(ds.Tables[0]); 
MySpan.InnerHtml = Source.Table.TableName; 
MyDataGrid.DataSource = Source; MyDataGrid.DataBind();  }</script><body>  
<h3>  <font face= "Verdana">Данные из XML:   
<span runat="server" id="MySpan"/></font></h3>
<ASP:DataGrid id="MyDataGrid" runat="server"
Width="900" BackColor="red" BorderColor="black"
ShowFooter="false" CellPadding=3 CellSpacing="0" Font-Name="Verdana" Font-Size="8pt" 
HeaderStyle-BackColor="green" MaintainState="false"  /></body></html>

Как видно, есть небольшие отличия от работы с DataSet, заполняемым из SQL БД, заключающиеся в основном в использовании FileStreamObject. Однако, на мой взгляд, текст достаточно прозрачен и не нуждается в комментариях.

Подведем итог. ADO.NET представляет новую структуру объектов и новую модель доступа к данным, позволяющую улучшить производительность наиболее часто встречающихся приложений. Это дает нам основания пророчить ADO.NET как основную технологию доступа данным в веб приложениях.