KNOW INTUIT, Лекция, Използване на бази данни в приложения

Прекъснати набори от данни

Базираната на връзката логика на взаимодействие между клиентското приложение и базата данни, разгледана по-рано, е оправдана за осъществяване на еднопосочна комуникация с базата данни. Това може да бъде или получаване на данни, или изпълнение на заявки, свързани с извършване на промени в тях. Изпълнението на сложни операции за взаимодействие с бази данни е много времеемък процес и изисква писане на много код, отстраняване на грешки и т.н. ADO.NET предоставя по-усъвършенствани начини за организиране на двупосочно взаимодействие на приложение с база данни, базирано на отделни набори от данни.

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

Клас на набор от данни

DataSet е контейнер, съдържащ обекти DataTable и Relation. DataTable е таблица, съставена от редове и колони. Редовете на таблицата се представят от обект DataRow, който от своя странае колекция от колони на таблица (обект DataColumn). Данните в DataSet се отделят от базата данни. Всички промени в данните се кешират в DataRow обекти. Ако има нужда от прехвърляне на промени в данните на обекта DataSet, е възможно да се прехвърли само променената част от данните, което може значително да спести ресурси на комуникационния канал, тъй като в този случай се прехвърля много по-малко количество данни. Обобщавайки всичко по-горе, можем да заключим, че използването на обекта DataSet в някои случаи е по-ефективно от DataReader. Най-честите ситуации, в които се препоръчва използването на обекта DataSet са следните:

Вижте [1] за повече информация относно сценариите за използване на DataSet.

Използване на DataSet

Вече беше казано по-горе, че DataSet се състои от таблици, които от своя страна се състоят от редове, а те от своя страна се състоят от колони. Всеки от изброените елементи е имплементиран като клас. За да управлява офлайн промените, DataSet следи информацията за версията на всеки DataRow обект. Това означава, че когато ред се редактира, оригиналната му стойност се съхранява в паметта и редът се маркира като модифициран. Подобни действия се случват при добавяне и промяна на редове DataTable. В бъдеще само стойностите на онези редове, които са били засегнати от промените, могат да бъдат прехвърлени в базата данни. По този начин DataSet никога не поддържа постоянна връзка с базата данни.

За да извлечете данни от базата данни и да попълните обекта DataSet с тях, трябва да използвате друг обект DataAdapter, който, наред с други неща, ви позволява да актуализирате данните в базата данни въз основа на промените, направени в DataSet.

Клас DataAdapter

DataAdapterе връзката между базата данни и DataSet. По-точно, той свързва базата данни и обекта DataTable, разположен вътре в DataSet.

DataAdapter съдържа три основни метода, които му позволяват да извършва всички необходими операции, свързани с извличане и актуализиране на данни.

НапълнетеИзпълнение на заявка от тип Select, дефинирана в свойството SelectCommand, и добавяне на таблицата, получена от тази заявка, към DataSet.
FillSchema()Изпълнение на заявка от тип Select, чийто текст се намира в свойството SelectCommand, и добавяне на таблица, която съдържа само структурата на данните, получени в резултат на заявката към DataSet.
Актуализиране()Прилага всички промени, направени в DataTable към източника на данни. Това изпълнява командите за вмъкване, актуализиране и изтриване, намиращи се в свойствата InsertCommand, UpdateCommand, DeleteCommand.

Нека да разгледаме пример за използване на обекти DataSet и DataAdapter за извличане на данни от база данни, попълване на DataSet и показване на данните на страница на уеб приложение.

На първо място, трябва да установите връзка с източника на данни. За да направите това, трябва да използвате низ за връзка, както и обект Connection. В този пример връзката ще бъде направена към базата данни Test_Db, разположена на локалния SQL Server Express 2005 сървър:

Нека създадем обект на DataAdapter и му предадем низ за заявка и низ за връзка с база данни като параметри:

Сега трябва да създадем обект DataSet и да го попълним с данни с помощта на DataAdapter:

От горния пример можете да видите, че методът Fill на обекта da приема като параметри името на обекта DataSet, където искате да поставите данните,върнат в резултат на изпълнение на заявката, която е дефинирана в низа sqlString. Във втория параметър можете да посочите име, което ще бъде свързано с таблицата, създадена в DataSet. Примерът показва, че в този случай не се използва явно извикване на метода Open на обекта Connection - този метод се извиква имплицитно, когато се изпълнява методът Fill. Така DataAdapter първо отваря връзка към базата данни, след това извършва необходимите манипулации с данни и след това затваря предварително отворената връзка. Ако по някаква причина трябва да се промени такъв алгоритъм за взаимодействие с базата данни, е необходимо да се отвори връзка с базата данни, преди да се извика методът Fill. В този случай DataAdapter ще използва вече съществуваща връзка.

След като необходимият набор от данни бъде извлечен от базата данни, той трябва да бъде показан на уеб страница. За да направите това, можете да използвате метода, описан по-рано, когато разглеждате обекта DataReader. В този случай обаче може да се постигне много по-ефективно използване чрез използване на възможностите за обвързване на данни на визуални обекти, които могат да показват данни на екрана. Основната идея зад обвързването на данни е да се създаде връзка между обект с данни и контрола. Цялата по-нататъшна работа, свързана с извличането на данни и показването им на екрана, се извършва от ASP.NET. Нека разгледаме основните методи за обвързване на данни и характеристиките на тяхното показване на екрана, внедрени в различни контроли.

Обвързване и показване на данни

Свързването на данни е много мощен инструмент за организиране на автоматично показване на данни в контрол без използване на програмиране.

Повечето контроли в ASP. NET поддържа обвързване на данни. В този случай обвързването може да работи както за данни сединична стойност и за данни с множество стойности. Обвързването с една стойност означава, че контролата може да показва една стойност, извлечена от източника на данни. Такива принципи се използват от контролите TextBox, LinkButton, Image, Hyperlink. Свързването на множество стойности означава, че контролата може да показва множество стойности, извлечени от източника на данни. Контролите, които поддържат обвързване с множество стойности, се основават на списъци и електронни таблици. Типични представители на такива контроли са ListBox и GridView.

За да обвържете контролите с източник на данни, трябва да зададете стойността на свойството DataSource, в което да посочите името на обекта, който съдържа данните, необходими за показване. Задаването на свойството DataSource създава логическа връзка между контролата, способна да показва данни, и обекта с данни, който трябва да се покаже. След като източникът на данни е дефиниран, е необходимо да го попълните с данни. Това се прави с помощта на метода DataBind() на попълнената с данни контрола, която извлича данните от източника, преминава през източника, дефиниран в DataSource, и опреснява страницата. Свързването с множество стойности е най-мощният тип обвързване, тъй като не изисква програмиране за преминаване през стойностите на източника на данни и показването им на екрана - тази логика вече е внедрена в контрола, която поддържа множествено обвързване.

Нека да разгледаме основните принципи на използването на двата вида обвързване на данни.

Обвързване с една стойност

Контролите, които поддържат обвързване на данни с една стойност, позволяват обвързване на даннинякои от техните свойства към данни с помощта на израз за свързване на данни. Изразът за обвързване на данни се въвежда в основния текст на страницата .aspx и е ограден с разделители.

Изразът за обвързване на данни може да бъде публична променлива, защитена променлива или всеки друг израз, който може да бъде оценен по време на изпълнение на страницата. Така че като израз за обвързване на данни е допустимо да се използват функции, свойства, обекти, дефинирани в класа на страницата.

За да оцените обвързващия израз, извикайте метода Page.DataBind() в кода на вашето приложение. Когато този метод бъде извикан, ASP.NET проверява всички изрази на текущата страница, извършва изчисления, ако е необходимо, и ги замества с подходящите стойности.

Като пример, помислете за обвързване на елемента Label към данните от таблицата „Продукти“. За да направите това, нека създадем метода GetProductName(), който връща като стойност съдържанието на първия ред от колоната „ProductName“ на таблицата „Products“.

Сега трябва да добавим елемент Label към страницата .aspx и да зададем обвързващия израз за свойството Text на елемента.

В метода Page.Load() нека извикаме метода Page.DataBind().

Резултатът от това приложение е показан на фиг. 10.11.

intuit

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

Както можете да видите от този пример, само една стойност от всяко поле на таблица може да бъде показана по този начин. Как е възможно да се извърши многократно обвързване и да се изведат всички стойности, извлечени от базата данни, ще бъде обсъдено по-долу.

В допълнение към обвързващи изрази, ASP.NET поддържа и $-изрази, които са последователност от код, който може да бъде добавен към aspx-страница и които ще бъдат изпълнени при достъп до страницата. Visual Studio 2005 включва вграден $expression builder, който ви позволява да извличате потребителски настройки на приложението и информация за низ за свързване, намиращи се във файла web.config. Например, за да извлечете настройка на приложение с име MySetting и да покажете нейното съдържание на екрана, можете да поставите елемент Literal на страницата със свойството Text, зададено на .