Общ модел за достъп на данни чрез ADO.NET

Какво представлява ADO.NET

ADO.NET е:

  • Еволюционен, по-гъвкав наследник на ADO
  • Система предназначена за несвързани среди
  • Модел за програмиране със съвременна поддръжка на XML
  • Множество от класове, интерфейси, структури и списъци, които управляват достъпа до данни в .NET framework

ADO.NET представлява набор от библиотеки за работа с данни, включени в .NET Framework. Те включват класове, интерфейси, структури и други типове и са предназначени за достъп до различни източници на данни. Широко използвана доскоро Windows технология за достъп е ADO (ActiveX Data Objects).ADO.NET е неин наследник, и я разширява с много нови възможности, които се налагат от развитието на технологиите – например, съобразява се с изпълнението в Интернет среда, която налага да се използва достъп с непостоянна връзка (connectionless). ADO.NET е изцяло базиран на .NET Framework и притежава много от неговите характеристики – поддръжка на множество езици, автоматично управление на паметта, обектно-ориентиран дизайн, обща система от типове и конвенция за именуване. Предоставят се средства, които позволяват с данните да се работи независимо от какъв източник идват.

Различните класове и интерфейси, които предлага ADO.NET

Te са разпределени в няколко основни пространства от имена:

  • System.Data – съдържа основните архитектурни класове на ADO.NET. В него влизат например класовете DataSet, DataTable,DataRow.
  • System.Data.Common – в това пространство от имена се съдържат класове, които се използват независимо от източниците на данни, като например DataAdapter.
  • System.Data.SqlClient – включва специфични класове за връзкасъс SQL Server, които позволяват да се осъществи връзка с MS SQL Server, да се извличат данни и да се изпълняват команди. Някои от класовете в това пространство от имена са SqlConnection, SqlCommand, SqlDataReader и др.
  • System.Data.SqlTypes – съдържа класове които съответстват на вградените в SQL Server типове данни и представляват по-бърза и сигурна алтернатива на другите типове. Включва SqlInt32, SqlDouble, SqlDateTime и много други.
  • System.Data.OleDb – осигурява класове за връзка с OleDB източник на данни. В него влизат например класовете OleDbConnection, OleDbCommand , OleDbDataReader и др.
  • System.Data.Odbc – класове за връзка с ODBC. Съдържа например OdbcConnection, OdbcCommand и др.
  • System.Xml – това пространство от имена съдържа класове, които поддържат обработката на XML данни и връзката между релационния модел и XML.

Принцип на работа на ADO.NET

ADO.NET предлага програмен модел за работа с данните, който съответства на двата модела за достъп до данни – свързан и несвързан. Освен това обектният модел на ADO.NET предлага много фин контрол върху връзката с източника, изпълнението на команди и обработката на данните. В ADO.NET се прави ясно разграничаване между достъпа до данните и тяхната манипулация. Важна характеристика на ADO.NET е възможността за работа в несвързана среда. В ADO.NET тази възможност е вградена, а това улеснява разработката на многослойни приложения и Web услуги. ADO.NET се състои от компоненти за работа в свързана и несвързана среда, които могат да имат имплементация за различни бази от данни.

Доставчиците на данни са съвкупности от класове, които осъществяват връзка с различни бази от данни. Те осигуряват възможност да се изпълняват команди и да се получават резултатите по начин, който е независим от източника на данни и неговата специфична функционалност. Доставчиците на данни са проектирани да осигуряват ефективен достъп за промяна на данните или само за извличане. За различните системи с бази данни се използват различни доставчици, като всеки е оптимизиран за работа със съответната база. Най-отгоре са класовете, чрез които се осъществяват свързаният и несвързаният модел. Тези класове предоставят общ интерфейс, независещ от конкретния източник на информация. Връзката с него се осъществява посредством съответния Data Provider.

ado.net

Реализация на свързан модел в ADO.NET

Свързан модел имаме в случаите, когато данните се пазят на сървъра и клиентът е постоянно свързан към него. При този архитектурен модел, за да изпълни своите задачи клиентското приложение постоянно комуникира със сървъра.
Като идеология и начин на действие в ADO.NET, свързаният модел се имплементира чрез три основни класа – клас за отваряне на връзка (SqlConnection), клас за изпълнение на команда/команди (SqlCommand), клас за обработка на редовете, получени като резултат от изпълнена заявка, който наричаме четец (SqlDataReader).

Последователността от действия за изпълнение на команда към сървъра са:

  1. Отваряне на връзка.
  2. Изпълнение на команда/команди.
  3. Обработка на редовете, получени като резултат от заявката чрез четец.
  4. Затваряне на четеца.
  5. Затваряне на връзката (ако няма да се изпълняват повече команди).

Предимства

Свързаният модел работи директно със SQL заявки и е по-близък до релационните бази от данни. Това прави производителността му много добра. При него се изискват по-малко усилия от страна на разработчика. Съществено предимство на този подход е, че по-лесно се контролира конкурентният достъп на много потребители до данните в базата. Има специални механизми, чрез които може да се гарантира целостността на данните. Освен това вероятността да се работи с текущата версия на данните е много по-голяма, отколкото при несвързания модел. Връзката с базата от данни е отворена през цялото време на работа и се предполага, че данните ще се извличат на по-малки части. Поради това, ако междувременно са настъпили някакви промени в данните, е много вероятно тези промени вече да са отразени в изтеглените данни.

Недостатъци

Един от основните недостатъци на свързания модел е необходимостта от постоянна мрежова връзка с източника на данните. В някои случаи това може да се окаже проблемно и би довело до голямо натоварване на мрежата. Това не е единственият проблем. При много организации връзката между отдалечени офиси и централния сървър не е надеждна и свързаността не е постоянна, поради което се налага offline работа. Друг недостатък е заемането на ресурси  за продължително време. Резултат от това е лошата скалируемост на приложение, ползващо този модел – при нарастване на броя потребители може да се окаже, че физическите ресурси са недостатъчни да обслужат всички заявки. Проблемът е особено сериозен при Интернет приложенията, където е възможно едновременно много голям брой потребители да направят заявка към база от данни.

Свързан модел – пример

using System;
using System.Data;
using System.Data.SqlClient;
class TestSqlCommand
{
private const string CONNECTION_STRING = “Server=.;” +
” Database=pubs; Integrated Security=true”;
private const string COMMAND_SELECT_AUTHORS =
“SELECT au_fname, au_lname, phone FROM authors”;
static void Main()
{
SqlConnection con =
new SqlConnection(CONNECTION_STRING);
con.Open();
try
{
SqlCommand command =
new SqlCommand(COMMAND_SELECT_AUTHORS, con);
SqlDataReader reader = command.ExecuteReader();
using (reader)
{
while (reader.Read())
{
string firstName = (String) reader["au_fname"];
string lastName = (String) reader["au_lname"];
string phone = (String) reader["phone"];
Console.WriteLine(“{0} {1} – {2}”,
firstName, lastName, phone);
}
}
}
finally
{
con.Close();
}
}
}

Реализация в несвързана модел ADO.NET

Най-характерното за несвързания модел е, че се работи с копие на данните от базата, което се намира в паметта на локалната машина. Докато данните се обработват локално, не се поддържа отворена връзка към сървъра на базата от данни. Първоначално се отваря връзка към базата данни  и част от данните се зареждат и кешират в паметта в DataSet обект и връзката се преустановява. След обработка на заредените данни в паметта, е възможно повторно отваряне на връзка за внасяне на промените, които потребителят е направил. Това става най-често с класа SqlDataAdapter.
Предимства
Основно предимство на несвързания модел е, че клиентът се свързва с основната база от данни само когато има нужда. През останалото време той работи без връзка към нея. Това намалява натоварването на сървъра на базата от данни и изразходва по-малко ресурси. Често се случва приложението да се нуждае само да чете и визуализира данните. Тези операции могат да бъдат извършени и в несвързан режим,  като при това не се заемат ресурси на сървъра и други потребители също могат да се свързват междувременно. При намаляване на броя отворени връзки към базата се подобрява значи телно скалируемостта на приложението. Увеличаването на броя потребители не води до много по-голямо натоварване на базата от данни, защото ресурсите за обслужване на всеки потребител са необходими само докато трая неговата заявка и след това се освобождават. Друго предимство на несвързания модел е възможността приложението да работи в offline режим, без да има постоянна физическа свързаност със сървъра на базата данни.

Недостатъци

Недостатък на несвързания модел на достъп е, че данните при клиента не
винаги са текущи. След изтегляне и прекъсване на връзката с базата, в нея данните могат да бъдат променени от други потребители, но тези промени няма да се отразят върху изтеглените данни. Така има опасност да се работи с остарели данни. Друг недостатък е, че трябва да се положат допълнителни усилия от разработчика за разрешаване на конфликтите между различните версии на данните. Подобен случай възниква, ако след запазване на данните на локалната машина потребителят промени някаква стойност в тях, а съще временно друг потребител промени същата стойност в основната база. Тогава, когато потребителят се опита да обнови данните в базата, настъпва конфликт.
Работата с данни в несвързана среда може да се опише със следната последователност от стъпки:

  1. Отваряне на връзка.
  2. Създаване и запълване на DataSet обект.
  3. Затваряне на връзката.
  4. Работа с DataSet обекта (обработка на данните).
  5. Отваряне на връзка.
  6. Нанасяне на промените от DataSet обекта върху данните в базата от данни (и разрешаване на конфликтите, когато има такива).
  7. Затваряне на връзката.
  8. Класът DataSet

Класът DataSet съдържа съвкупност от таблици и връзки между тях. Те са представени чрез две основни колекции – Tables и Relations. Свойството DataSet.Tables е обект от тип DataTableCollection и съдържа един или повече обекта от тип DataTable. Всеки обект DataTable представя таблица от източника на данни. DataSet.Relations е свойство, което е от тип DataRelationCollection и съдържа един или повече обекти от тип DataRelation. Те представят връзка от тип родител-наследник (master-detail) между две таблици от базата, като обикновено се базират на стойността на външен ключ.

Множества данни – DataSets

Основно пространство от имена за работа с бази данни е System Data. ADO.NET използва множество данни – DataSet за съхраняване на несвързани данни. Тази нова структура е подобна на ADO recordset, но има и съществени различия. Множеството записи ADO recordset изглежда като отделна таблица, даже и данните да идват от различни таблици. Крайното множество от записи – recordset е само редове и колони. Докато множеството данни – DataSet, може да съхрани множество таблици в своя кеш. Може да дефинирате партньорските връзки (relationships) между тези таблици, а след това да четете от индивидуалните таблици или от свързаните таблици и да получавате данни. По своята същност, множеството DataSet, работи като миниатюрно копие на базата данни, въпреки че съдържа малко подмножество от данни или таблици. Множеството данни DataSet не знае нищо за подлежащата база данни

Класът DataTable

Класът DataTable съхранява данните, подобно на таблица в базата от данни. Той представлява кеширано копие на данните от таблица в паметта. Този клас има важна роля в архитектурата на ADO.NET. DataTable може да се използва както самостоятелно, така и като част от DataSet обекти. DataTable дава възможност за извършване на различни операции върху данните, които съхранява. Данните могат да бъдат филтрирани, сортирани и модифицирани. DataTable съдържа три колекции – Columns, Rows и Constraints. Колекциите Columns и Constraints дефинират схемата на таблицата , докато Rows съдържа самите данни.
DataTable таблиците не само съдържат в себе си съвкупност от редове със стойности, но и пазят всички промени, направени по тях. Това много улеснява идентифицирането на промените, които са извършени в дадена таблица от момента на нейното зареждане. Всяка таблица поддържа списък от добавените, изтритите и променените редове в нея. Този списък първоначално е празен. Той може да бъде извлечен по всяко време с метода GetChanges(), а при нужда може да бъде изтрит с метода AcceptChanges(). При актуализиране на данните в базата извличаме променените записи с метода GetChanges() и извършваме съответни промени, като разрешим евентуалните конфликти, които се получават. Накрая извикваме метода AcceptChanges(), за да анулираме списъка с промените по таблицата, тъй като те вече са отразени в базата данни.
По-важните методи на класа DataTable са свързани с добавянето на нови редове и колони:
- NewRow() – създава нов празен ред (DataRow), който съдържа полета,съответстващи на колоните от таблицата, но не го добавя в таблицата. Програмистът трябва явно да го добави, евентуално след като е задал стойности на полетата му.
- Rows.Add(DataRow) – добавя ред към колекцията Rows на таблицата.Редът трябва да е бил вече създаден преди това.
- Columns.Add(DataColumn) – добавя колона към колекцията от колони на таблицата. Колоната трябва да е била създадена преди това.
-  GetChanges() – извлича списъка на промените, направени по таблицата.
- AcceptChanges() – нанася всички промени по данните в таблицата иизчиства списъка на промените.
- GetErrors() – връща редовете с грешки. Използва се най-често за извличане на списъка със записите, които са предизвикали конфликт при обновяване на базата данни.

Работа с DataTable – пример

DataTable tbl = new DataTable(“Authors”);

tbl.Columns.Add(“au_id”, typeof(int));
tbl.Columns.Add(“au_fname”, typeof(string));
tbl.Columns.Add(“au_lname”, typeof(string));
tbl.Columns.Add(“au_phone”,typeof(string));

// The row is detached (not added to the table)
DataRow row = tbl.NewRow();
row[0] = 1;
row[1] = “Branimir”;
row[2] = “Giurov”;
row["phone"] = “+359 2  XXXX”;

tbl.Rows.Add(row);

Класът SqlDataAdapter

Нанасянето на промените в базата данни и разрешаването на конфликтите, които могат да се получат, е задача, която се извършва най-често посредством DataAdapter класовете. Класът DataAdapter осъществява връзката между DataSet обекта и източника на данни. При работа с SQL сървър се използва наследникът му SqlDataAdapter.
-DataAdapter дефинира команди, чрез които извършва извличането на данните от източника и тяхното обновяване. По-конкретно, за извличане на запис се използва командата SelectCommand, за добавяне на запис – InsertCommand, за промяна на запис – UpdateCommand и за изтриване на запис – DeleteCommand. Тези команди представляват SQL заявки, които извършват съответните действия. За да работи правилно един DataAdapter, освен командите, трябва да му се зададе и връзка към базата данни (Connection), през която да ги изпълнява.

Доставчици на данни (Data Providers) в ADO.NET

Доставчиците на данни (Data Providers) са съвкупности от класове, които осъществяват връзка с различни бази от данни. Те осигуряват възможност да се изпълняват команди и да се получават резултатите по начин, който е независим от източника на данни и неговата специфична функционалност. Те създават тънък слой между ADO.NET приложението и източника на данните (базата данни). Доставчиците на данни са проектирани да осигуряват ефективен достъп за промяна на данните или само за извличане.
За различните RDBMS се използват различни доставчици (Data Providers),като всеки е оптимизиран за работа със съответната база от данни. Това се налага, тъй като различните производители използват различни протоколи за достъп до сървъра на базата. Различните доставчици на данни осигуряват сходна базова съвкупност от възможности, но въпреки това е възможно между тях да има разлика във функционалността. Това се дължи на разликите между различните източници, както и на разлики в имплементацията.

Дефинират се от 4 основни обекта:

  1. Connection – за връзка с базата
  2. Command – за изпълнение на SQL
  3. DataReader – за извличане на данни
  4. DataAdapter – за връзка с DataSet

Класове на един Data Provider

Всеки доставчик на данни (Data Provider) съдържа 4 основни класа, с помощта на които се осъществява достъпа до съответната база от данни. Те осигуряват връзка към базата (Connection), изпълнение на команди (Command), поточно извличане на данни (DataReader) и адаптери за работа при несвързан модел (DataAdapter). Допълнително в доставчиците на данни са реализирани и класове за работа с параметрични заявки (Parameter), за работа с транзакции (Transaction) и др. С цел унифициране на класовете за работа с релационни бази от данни, реализирани от различните доставчици на данни в ADO.NET са дефинирани някои общи интерфейси, които се имплементират от доставчиците по специфичен за тях начин.

Използване на транзакции

Транзакциите са много важна възможност на модерните сървъри за управление на бази от данни. Чрез тях се извършва изолация и синхронизация на достъпа до данните от различни работни места, както и едновременното потвърждение (commit) или отказване (rollback) на поредица от заявки. ADO.NET предлага множество функции за лесна програмна работа с транзакции.
- Основните възможности, които задължително се налага да ползваме са започване на транзакция: SqlTransaction trans = dbConnection.BeginTransaction(); въвличане на команда в дадена транзакция: command.Transaction = trans; потвърждаване на транзакция: trans.Commit(); анулиране на транзакция: trans.Rollback();
При една транзакция или всички команди въвлечени в нея се изпълняват (commit), или, при възникване на проблем с някоя от тях, всички операции се отказват (rollback).
- Всяка транзакция има ниво на изолация, което определя до каква степен можем да сме сигурни в достоверността на данните, които се обработват по време на транзакцията. ADO.NET предоставя възможност за задаване на ниво на изолация. Нивото на изолация се дефинира с изброения тип IsolationLevel на класа SqlTransaction. Типовете IsolationLevel са почти същите като в SQL Server: с най-ниско ниво на изолация е Chaos – няма изолация; ReadUncommited – позволява текущата транзакция да чете непотвърдени данни, добавени или променени от други, паралелно изпълняващи се, транзакции, не осигурява повторяемост при последователно четене на едни и същи данни и не предпазва от “фантомни записи” (записи, които се появяват в дадена таблица по време на транзакцията в резултат работата на друга, паралелна транзакция). Следват ReadCommited и RepeatableRead. С най-високо ниво на изолация е Serializable – заключва всички таблици, с които работи текущата транзакция по такъв начин, че останалите, паралелно изпълняващи се транзакции, да не могат да променят и добавят данни в тях докато текущата не завърши. Осигурява повторяемост при четенето и защита от “фантомни записи”.

SqlConnection – пример

const string CONNECTION_STRING =
“Server=localhost; Database=Northwind; ” +
“Integrated Security=true; ” +
“Persist Security Info=false”;
// Create the connection
SqlConnection con =
new SqlConnection(CONNECTION_STRING);
using (con)
{
// Open connection
con.Open();
// Use the connection here
// …
}

InfoMessage – пример

private const string CONNECTION_STRING = “Server=.; ” +
“Database=Pubs; Integrated Security=true”;
private SqlConnection mConn;
private void InitConnection()
{
mConn = new SqlConnection(CONNECTION_STRING);
mConn.InfoMessage +=
new SqlInfoMessageEventHandler(ConnInfoMessage);
mConn.Open();
}
private void ConnInfoMessage(object sender,
SqlInfoMessageEventArgs e)
{
Debug.WriteLine(“SQL Server message: ” +
e.Message + “   Source: ” + e.Source);
}

Сходни статии:

  1. Средства на JAVA за достъп до бази данни. Потребителски JSP тагове Стандарт JDBC JDBC (Java DataBase Connectivity) е стандарт, осигуряващ платформено независим достъп до релационни бази данни посредством заявки, реализирани по стандарта SQL. Средствата на JDBC API нямат отношение към стандартизацията...
  2. База Данни Европа и достъп до действащото законодателство на Европейския Съюз автор: Стоян Георгиев Специализирано висше училище пo библиотекознание и информационни технологии дисциплина: Информационни системи Европейският съюз е единствено по рода си икономическо и политическо партньорство между 27 демократични европейски страни,...
  3. Разпределени бази данни. Предимства и недостатъци на работата с база данни Осигурява икономия при използването на персоналните компютри, намалява грешките от централизацията на данните и нараства отговорностите към мениджърските нужди. Данните могат да бъдат разделени на части и базирани на регионален,...
  4. База данни в Delphi Програмирането на бази данни е свързано с използването на някои специфични инструменти и подходи. Най-общо, базите данни представляват съвкупност от един или няколко файла, които съдържат записно-ориентирани съвкупности от данни...
  5. Архитектура на База Данни. Етапи на проектиране. Модели бази данни Понятие за архитектура на База Данни Архитектурата на База Данни включва 3 нива Информационни връзки. Модели на данни. При проектирането на база данни се преминава през няколко етапа. Най напред...

Студио за уеб дизайн услуги, изработка на сайтове, SEO оптимизация и Интернет реклама Seven Web Design представя своите професионални уеб дизайн умения на високо ниво. Seven Web Design е продукт на Уеб Дизайн България Груп ООД ®
Comments are closed.