Достъп до елементите на колекция от data контроли

by mitkoka 22. Ноември 2008 17:34

 Ето как става достъпа до елементите на източника на data контроли като dataList, repeater или gridview

  Array of Strings:

 VB/C# <%# Container.DataItem %>

Field from DataView:

  VB <%# Container.DataItem("EmployeeName") %>

  C# <%# ((DataRowView)Container.DataItem)["EmployeeName"] %>

 Property from a collection of objects:

  VB <%# Container.DataItem.CustomerName %>

  C# <%# ((Customer)Container.DataItem).CustomerName %>

  Non-String property from a collection of objects:

  VB <%# CStr(Container.DataItem.CustomerID) %>

  C# <%# ((Customer)Container.DataItem).CustomerID.ToString() %>

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

Tags:

C#

NHibernate

by mitkoka 22. Ноември 2008 05:46

 

NHibernate

 

NHibernate представлява обектно – релационен мапър изграден на основата на Hibernate ver. 2.1.Последната версия на NHibernate e 1.2.1 и включва доста функции от Hibernate 3 както и подръжка на .NET 2.0, съхранени процедури и дженерикс типове.В момента се разработва версия 2.0.

Моделирането възоснова на обектно - релационния модел представлява преобразуване на релационния модел на базите данни до обектно ориентиран вид чрез съответствия от вида клас – таблица и свойство – колона.Този подход за моделиране се нарича Data Mapper.

При работа с Hibernate(NHibernate) най - общо процедурата е следната:Създаваме клас съответстващ на предварително създадена таблица в база данни.Този клас има полета и свойства съответстващи на колони от съответната таблица.При компилирането на този фаил NHibernete ще достъпва тези полета чрез рефлекция.

След като имаме таблица и съответстващ на нея клас трябва да направим фаил за съответствията (map file).Това е xml фаил съдържащ съответствията между таблицата и класа.Записва се с разширение (име на клас).hbm.xml и трябва да бъде записан като embedded resource за да бъде част от асеблито.При дефинирането на съответствията трябва да се окаже асемблито за да може NHibernate-a да го открие.

Също така трябва да имаме и кофигурационен фаил, който да описва текущата конфигурация на NHibernate-a.

Конфигуриране на NHibernate

Конфигурирането може да стане програмно или чрез XML фаил.Тъй като NHibernate предоставя богати възможности за работа с различни бази данни съществуват множество променливи, чрез които може да стане конфигурацията.При програмното конфигуриране подаваме IDictionary колекция от променливи на Configuration.SetProperties().При използването на XML фаил имаме няколко възможности.Можем да създадем конфигурационна секция за NHibernate в кофигурационния фаил на приложението.Той би могъл да бъде например web.config.Тази секция трябва да се казава<nhibernate>.Също така може да се използва специален конфигурационнен фаил hibernate.cfg.xml, който да съдържа единствено ифнормация за кофигурирането на NHibernate.Записването на стойностите на свойствата в кофигурациония фаил става чрез атрибут <add key=”” value=”” />

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

Променливите включват определяне на hibernate.connection.provider_class като NHibernate поддържа собствени класове, които могат да бъдат зададени като стойност.В противен случай може да се използва асембли и клас имлементиращ IConnectionProvider.Същото се отнася и за променливата hibernate.connection.driver_class.Определя се и стойност, на hibernate.connection.connection_string и hibernate.dialect hibernate.dialect.Последната съдържа информация за базата данни която ще достъпваме.Стойностите на тзаи променлива са предварително определени според това какви бази данни поддържа версията на NHibernate – а, с която се работи.Поддържат се всички известни бази данни.

 

Файолве на съответствията (Мапинг файолве)

В  тези файлове записваме връската между таблиците и класовете.Един xml фаил може да съдържа повече от един клас.Могат да бъдат написани ръчно или да се използват специални инструменти генериращи .hbm.xml документи.Това какви елемнти ще съдържа мапинг файла зависи от конкретната таблица и връзките и с останалите таблици.Мапинг файловете са написани object-centric, което означава че са създадени спрямо структурата на класовете а не на таблиците. 

<hibernate-mapping> - това е елементът, в който посочваме място на нашия клас.Това става с елементите namespace и assembly.Атрибутите в този елемент не са задължителни.

<class> - Това е елементът определящ връзката таблица -  клас.Поделементите му от своя страна определят връзката име на колона – свойство.Единствените задължителни атрибути тук са table и name.Възможно е да се постави като атрибут  where - SQL клауза с цел да се извлвче определена част от таблицата.Може да бъде зададено как ще става записването на данните в таблицата.Определя се също дали при зареждане на даден обект ще бъдат зареждани и неговите под обекти при по – сложна йерархия от класове.

В клас елемента се поставя поделемент <id>, който ни дава уникален идентификатор на инстанцията на класа и първичния ключ от таблицата.<id> елемента съдържа под елемент <generator> генериращ идентификатора ако трябва да се подадат някакви параметри се използва елемент <param>.Подаваме различни параметри според това каква база данни използваме.Например sequence за Oracle и identity за MS SQL Server.

Когато имаме копозитетeн първичен ключ, тогава трябва да се запише всяка една колона от таблицата, определяща този ключ в отделен <key-property> елеменът.Тогава вмсето <id> използваме <composite – id>.

<discriminator> елементът, част от <class> секцията определя колона в таблицата, която ще бъде използвана като дискриминатор.Стойноста в тази колона се използва, когато в основния клас имаме клсове наследници на общ клас.Тогава стойноста в тази колона определя какъв клас да бъде инстанциран.Наличието на дискриминатор осигурява полиморфизъм на класовете наследници на базовия.

Елементът <property> осигурява връзката колона – свойство.Той е част от <class> елемента.Задължителен атрибут е именто на свойството от клас.Ако не бъде посчена колона от таблица, по-подразбиране се търси колона с името на свойството.Типът на данните също не е задължителен – може да бъде определен от посоченето асембли.

<may-to-one> и <one-to-one> са елементи, чрез които се посочва връзка към друг клас изразяващ на таблица.Единствения задължителен елемент тук е property, който определя свойство от външния клас.Ако е зададено само свойство тогава колната на таблицата съдържаща външния ключ съвпада с името на свойството, а класа в който се намира свойството се определя чрез рефлекция.Типът на свойството определя подразбиращата се стойност на елемета class.Има възможност да бъде посочена колона с уникални стойости от външната таблица, която не представлява първичен ключ.Ако това не бъде направено по подразбиране се използва колоната с първичния ключ.

В случай, че имаме базов клас с един или повече наследника, а в таблицата съответстваща на този клас имаме колона дискримитор, която се грижи за полиморфизма на базовия клас трябва да изразим това в мапинг файла.Това става чрез елемент <subclass>.Като атрибут на този елемент посочваме стойност  съдържаща се в колоната дискриминататор discriminator-value.Така се определя какъв клас съответсва на всеки ред от таблицата. Ако под клсаовете са в отделна таблица тогва се използва елемента <joined- subclass>.Тъй като всеки клас наследник в този случай има собствена таблица в базата колона за дискриминатор не съществува и съответно нямаме атрибут discriminator-value.Останалите атрибути са същите както при <subclass> елемента.

В файла на съответствията има възможност да бъдата посочвани коленкциите садържащи се в калса.За това се грижат елементите <set>, <list>, <map>, <bag>, <array> и <primitive-array>.Важно е да се отбележи, че NHibernate изисква колекциите в класовете да бъдата декларирани чрез интерфейс.Колекцията съдържаща се в една таблица има собствена таблица.В рамките на един елемент отразчващ колекция се записва връзката между таблицата на каласа и таблицата на колекцията <one-to-many>, <many-to-many>.Посочват се също колоните, чрез които ще се осъществи връзката между отделните таблици.

Колекциите съдържат елемент lazy.Чрез него се определя кога колекцията да бъде заредена.За да не се хабят ресурси колекцията може да бъде заредена когато действително има нужда от нея.

 

Методи за получаване на обекти от база  данни

Чрез NHibernate имаме възможност да извличаме обекти както от таблици така и от изгледи(view) .Това става като вместо име на таблица забишем име на изглед в атрибута <class>.

Начините за обработка на данни в чрез NHibernate са следните:

<!--[if !supportLists]-->·         <!--[endif]-->Чрез HQL(Hibernate Query Language)

<!--[if !supportLists]-->·         <!--[endif]-->Чрез стандартен SQL

<!--[if !supportLists]-->·         <!--[endif]-->Чрез  Query By Criteria (QBC) и Query By Example (QBE)

Препоръчва се изплозването на HQL пред останалите два метода.Това е език подобен на SQL но по – гъвкав от него, защото предоставя допълнителна функционалност.За разлика от SQL  той не използва таблици и колони, а класове и свойства.Също така HQL връща дирктно обект, а това че работи с обекти му дава възможност да доразвие стандартния sql до обеkтно ориентиран език.

Можем да извличаме данни и чрез използването на NHibernate.ICriteria, който изразва заявка към базата.За създаването на ICriteria обект се използва ISession обект.Ако не бъдат зададени критерии към заявката то тя просто ще върне всички данни от съответната таблица.

ICriteria crit = sess.CreateCriteria(typeof(Cat));

List cats = crit.List();

Могат да бъдат задавани всякакви SELECT чрез методите на клас NHibernate.Expression.Expression, чрез който можем да добавим определени ограничения на връщаните рзултати:

IList cats = sess.CreateCriteria(typeof(Cat))
.Add( Expression.Like(“Name”, “Fritz%”) )
.Add( Expression.Between(“Weight”, minWeight, maxWeight) )
.List();

Влкючват се ралични методи, с които се филтрират данните идващи от заявката.Възможно е и да се добави чист SQL към критерите на заявката без да се използват останалите методи на класа Expressinon.

Заявки могат да бъдат подавани и чрез конкретен обект.Създаваме обекта на класа към чиято таблица ще бъде отправена заявката и го подаваме със съответните стойности на метода Create() на клас  NHibernate.Expression.Example.

Използването на SQL в NHibernate става чрез ISQLQuery.Методът  ISession.CreateSQLQuery() взема като аргумент SQL заявката и връща Query обект.От този обект се извлича информацията като се извикват неговите методи определящи например вида на изходните данни – дали да бъдат представени като обекти или да бъдат просто стойности.Чрез методът SetString() добавяме параметрите към заявката ако има такива,а данните излизат от Query обекта чрез извикването на метода List(), който връща IList.

В NHibernate могат да се използват и наименовани SQL заявки(Named SQL queries).Тези заявки се пишат директно в мапинг файла и се извикват прогрмано чрез името, което им е зададено.По този начин могат да бъдат извиквани и съхранени процедури.Във файла на съответствията се записват данните които трябва да бъдат получени от съхранената процедура (ResultSet).Самата съхранена процедура се извиква според това с каква база работим.

 

 

Tags:

ASP.NET | C#

Референтни и стойностни параметри

by mitkoka 22. Ноември 2008 05:38

Преди да се прочете тази статия трябва добре да се осмисли разликата между стойностни и референтни типове (или парамети както ще използвам в статията тъй като става въпрос за методи) и типове подадени по стойност и по референция.В първия случай просто става въпрос за различни типове параметри, а във втория за тяхното използване в методите!

Също така трябва да се знае какво точно означава:

 

Myclass a = new Mycalss();

 

А то означава следните три неща:

 

1. Създаване на референция (Myclass a)

2. Създаване на обект (new Myclass();)

3. Насочване на референцията към обекта (=).

 

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

 

 

ПОДАВАНЕ НА ПАРАМЕТЪР ПО СТОЙНОСТ

 

Референтни типове(параметри)

Когато се подават параметри на даден метод те по принцип биват подавани по стойност (въпреки, че това са референеции).За да бъдат подадени като такива не

се изсиква поставянето на ключова дума пред параметъра.Подаденият по стойност параметър води до заделяне на ново място за него или с други думи се направи копие на подадения параметър в стека. Затова промяна на неговата стойност при изпълнение на метода няма да прдизвика промяна на оригиналния параметър подаден на метода.Просто ще се пренасочи референцията в друга посока.Това може означава че на параметъра ще се зададе стойност null или ще се посочи друго място в хиипа съответно друг обект (от същият тип разбира се).Но ако извикаме метод на подадения параметър то ние викаме метод на обеката, към който сочат и оригиналния параметър и този, който се използва в метода.Ето защо това ще доведе до промяна на обекта и ще рефлектира върху оригиналният параметър!!!

 

Стойностни типове(параметри)

Какво би се получило ако параметърът подаден на метода е от стойностен тип?

Тук подавеме стойностен тип и методът прави копие на стойноста му (Важно е да припомня, че стойностния тип представлява самите данни а не връзка към тях???????). Ето защо всяка промяната на подадената стойност не води до промяна на оригиналната стойност. Ако извикаме метод на стойностния тип той няма да промени оригиналният обект както би се случило при референтните типове, които биха се обърнат към обект в хиипа.

 

Общо казано подаването на параметър на функция означва неговото копиране така, че оригиналният паранетър да не може да бъде променен в

процеса на изпълнение на фукцията.

 

ПОДАВАНЕ НА ПАРАМЕТЪР ПО РЕФЕРЕНЦИЯ

 

Референтни типове

За да се подаде параметър по референция пред параметъра се слага ключова дума ref.Разликата от подаването по стойност е че тук не се прави копие на параметъра а се работи с подадения.Това означава, че работим с оригиналния параметър и всяка промяна направена върху параметъра в метода ще доведе до промяна на подадения оригинален параметър.Например ако методът променя посоката на параметъра на null или посочва нов обект (= new Myclass(); като естествно параметъра също е MyClass()) това ще доведе до промяна на оригиналния параметър който също ще бъде насочен към null или към Myclass();

 

Стойностни типове

Логично при подаването на стойностен тип по референция подаваме самите данни и методът работи със самият оригинален обект.Няма копиране - подаваш оригинала!!!

 

 

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

Tags:

C#