Обекти DataReader и DataView, в приложения 2

Обекти ADO.NET DataReader и DataView, използването на приложения ASP.NET 2.0

Този модул се фокусира върху допълнителен модел vomzozhnostyam ADO.NET обект.

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

Какво е различен от DataReader набора от данни:

· Данните могат да бъдат достъпни чрез DataReader само за четене;

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

· DataSet работи в режим на прекъсване на връзката, DataReader - само съединения;

· DataSet може да бъде свързана с множество органи за управление на уеб-форма, DataReader - само един;

· DataReader е по-бързо, но данните се прехвърлят само в една посока;

· Графичен потребителски интерфейс за работа със DataReader в VS. NET не е предвидено.

Ако се свързвате с SQL Server от приложение A SP един. NET. ще трябва да избират между удостоверяване S QL удостоверяване сървър и Windows. Когато S QL удостоверяване сървър потребителско име и парола, за да се свържете, ще трябва да се регистрират в HTML (и евентуално да ги прекара незащитена форма през HTTP. Ако сте с помощта на формуляр, за да въведете потребителско име и парола). Регистрира потребителско име и парола в C вързване низ. които могат да бъдат генерирани чрез стандартно означава VS. NET.

Ако използвате удостоверяване Windows (повече от препоръчителния начин), а след това на потребителското име и паролата не се предават по мрежата, и жалба до S QL сървър се прави в името на специалната сметка ASPNET - и е необходимо да се издадат необходимите разрешителни.

Сега, как се работи с ADO.NET не възразява чрез графичен интерфейс и софтуер.

Излишно е да се установи връзка се прави по SqlConnection или OleDbConnection. Основните и практика единствената собственост на този обект - ConnectionString, и който съдържа цялата информация за връзката. Този имот може да се предава като параметър да се създаде този обект:

Дим strConn Както String = _

"Източник на данни = Localhost"; _

"Първоначална каталог = Northwind;" _

Дим Връзка като нови SqlConnection (strConn)

При използване на обект DataSet взаимодействие с действителния източник произвежда DataAdapter вграден обект (те са, както обикновено, две разновидности - SqlDataAdapter и OleDbDataAdapter). Физически DataAdapter - набор от SQ L -command и указател към обекта на връзката. Основните свойства на DataAdapter:

· SelectCommand - представлява команда, с които данните се връща от източника;

· InsertCommand, UpdateCommand, DeleteCommand - ясно заглавие.

можете, например, да се създаде обект, така DataAdapter:

"Създаване на връзка

Дим вр като нови SqlConnection _

( "Източник на данни = Localhost; първоначален каталог = заведения;" _

"Интегриран сигурност = вярно; задържи инфо сигурност = True;")

"Създаване на DataAdapter

Дим га Както Ню SqlDataAdapter _

( "Изберете * от Автори", вр)

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

Дим DS като нови DataSet ()

трудно да се създаде в него необходимите вградени обекти като DataTable. Най-лесният начин да направите това с помощта на метода на запълване на DataAdapter обекта:

В данните DataTable автоматично създаване на нов обект, наречен Автори, структура и съдържание на която се определя по това, че се връща разследването определен за DataAdapter обект. Обърнете се към обекта е възможно чрез името му в колекцията Маси

или просто номер:

Достъп до специфични колони и редове могат да бъдат получени чрез събирането на колони и редове възрази DataTable:

Дим цв Както DataColumn

За всяка колона В ds.Tables (0) .Columns

DS .Tables ( "Автори") .Columns .Count

Вижте специфични области в таблицата може да бъде както от техните номера (ред / колона) и от линия и номер на колоната:

Разходка преминете през всички записи в DataTable обект, създаден на базата на масата на авторите. и въведена в низ променливи стойности във втората колона и колоната с името на о _ възможно lname така:

Дим R Както DataRow

Дим ул Както стринга

За Всеки R в ds.Tables ( "Автори"). Редове

ул = R ( "au_lname")

DataSet може да се свърже с контрола под формата на директно, и е възможно да се използва междинна обект DataView. DataView (като изглед в базата данни) - персонализиран изглед на данните от набор от данни. След като създадете DataView може да се използва за данни за сортиране, филтриране, търсене, редактиране и навигация.

За всяка от DataTable DataView обект с настройки по подразбиране се създава автоматично. Получаване на връзката за това може да бъде така:

Дим DV Както DataView = ds.Tables ( "Автори"). DefaultView

Разбира се, можете да създадете свой собствен и DataView, в които, например, вие ще получите само се интересуват от запис:

Дим DV Както Ню DataView (ds.Tables ( "Автори"))

След като бъде създаден набор от данни с всички под-обекти, можете да създадете контрол за работа с данните на формуляра и го свързват с набор от данни.

Например, ние имаме един обект DataGrid:

за да го свърже с набора от данни, можете да използвате следния код:

По подразбиране контрол е свързан с първия аспект DataTable (индекс на нула). За да се покаже различен DataTable обект или обект DataView, вие трябва да използвате DataMember имота (както е показано по-горе), или предават информация за желания таблицата директно имот DataSource:

По същия начин, контролът може да бъде предадена на обекта на дисплея вместо DataTable обект DataView:

Дим DV Както Ню DataView (ds.Tables ( "Автори"))

dv.RowFilter = "държавни =" CA "

Сега - за прихващане на грешки при работа с ADO.NET обекти.

Най-често се срещат следните грешки:

· Невъзможно е да се установи връзка (не е мрежов сървър е изключен, и т.н.) манипулатор грешка, трябва, разбира се, сложи на отваряне на връзка. Кодът, който обработва най-честите грешки при отваряне на връзката може да изглежда така:

Дим свързв Както New SqlConnection (.)

Дим га Както Ню SqlDataAdapter (. Conn)

Дим DS като нови DataSet ()

Catch EX1 Както System.Data.SqlClient.SqlException

Изберете дело ex1.Number

lblErrors.Text = lblErrors.Text _

( "Невалидно име на сървър")

Case 156, 170 "лош SQL синтаксис

lblErrors.Text = lblErrors.Text _

Case 207 "лошо име на поле в изберете

lblErrors.Text = lblErrors.Text _

( "Невалиден име колона")

Case 208 "лошо име на маса в изберете

lblErrors.Text = lblErrors.Text _

( "Невалиден име обект")

lblErrors.Text = lblErrors.Text _

( "Невалидно потребителско име")

lblErrors.Text = lblErrors.Text _

lblErrors.Text = lblErrors.Text _

Catch EX2 Както System.Exception

lblErrors.Text = lblErrors.Text _

( "Неочаквано изключение:" ex2.Message ".")

· Невъзможно е да се изпълни команда на сървъра (или при изпълнение имаше някои проблеми). Най-честата причина - невалиден синтаксис, неточно посочен името на обекта и т.н. Използва се да се намеси и същ обект Sql изключение, в който се предвижда събиране на грешки за всички грешки и предупреждения, които се връщат към сървъра:

Дим erData Както SqlClient.SqlErrorCollection = ex1.Errors

Дим аз Като цяло число

За I = 0 до erData.Count - 1

lblErrors.Text = ( "Грешка" аз ":" _

erData (I) .Number "," _

erData (I) .class "," _

erData (I) .Message "
")

За обекти SQLERROR, които съставляват тази колекция. има следните свойства.

· Клас - Грешка ниво тежест в съответствие с градации на SQL Server

· LineNumber - линия номер в партидата или съхранена процедура, за да се изпълни, че има грешка

· Съобщение - грешка на текстово

· Номер - номер на грешката

Един от базата данни за големи възможности е, че обектът DataSet може да се състои от няколко обекта DataTable. и където всеки DataTable обект може да бъде получена от неговия източник.

За да се запълни на масива DataTable обекти, ще се нуждаем от вашата DataAdapter обект за всеки DataTable. Друг важен момент: как да работят с DataAdapter може да бъде важно, ако поставяте данни от формата на масата, свързани с първичното / чужд ке у. Разбира се, първо трябва да извършите вложка в таблица, в която основният ключ с помощта на съответна DataAdapter. Например, ние имаме две таблици: Клиенти и поръчки. Поставянето им в набора от данни може да изглежда така:

Дим вр Както SqlConnection

Дим daCustomers Както SqlDataAdapter

Дим daOrders Както SqlDataAdapter

Дим DS като нови DataSet ()

"Създаване на връзка към базата данни кръчми

Връзка = New SqlConnection ( "източник на данни = Localhost;" _

"Интегриран сигурност = вярно; първоначален каталог = Northwind")

"Създаване на първата DataTable

daCustomers = New SqlDataAdapter _

( "Избор CustomerID, CompanyName от клиентите", вр)

"sozdaemvtoruyuDataTable

daOrders = New SqlDataAdapter _

( "Избор CustomerID, OrderID, ORDERDATE, ShippedDate от Поръчки", вр)

daOrders .Сипете (DS. "Поръчки")

Всеки DataTable обект задължително трябва да се създаде DataAdapter обект - общо ползване няма да работи.

Наборът от данни е предвиден и един обект като DataRelation - връзки между таблици. Когато създавате DataRelation е необходимо да се определи таблица родител (т.е. масата с първичен ключ) и детето (т.е. чуждестранни). Разбира се, тези таблици трябва да бъдат споделени колона и тя трябва да се отбележи,. Пример за създаване на DataRelation за нашите клиенти и поръчки:

"Създаване на DataRelation: всеки издател публикува много титли

Дим д-р Както DataRelation

Дим parentCol Както DataColumn

Дим childCol Както DataColumn

р = New DataRelation ( "CustOrders", parentCol, childCol)

Разбира се, основната причина, поради създадени данни за връзки с обекти - навигират в отношенията между таблици. За тази цел, методи и G etChildRows GetParentRow. Например, за да намерите всички поръчки за клиент в нашия пример, можете да:

currentParentRow = ds.Tables ( "Клиенти"). _

За Всеки R В currentParentRow.GetChildRows ( "CustOrders")

Етикет 1.Text = R ( "OrderID") ","

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

Дим parentTableView Както New _

Дим currentRowView Както DataRowView = _

Това се постига чрез DataView. която се филтрува, като се използва протокола, избран в друга контрола.

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

Както вече споменахме, DataReader обект се използва за получаване на данни от източника в режим на само за четене / само напред.

Това е особено полезно, когато:

- Вие трябва да направите възможно най-бързо до източника на елементарна заявка;

- когато, напротив, източника на данни, за да получите много (десетки хиляди записи) и ги поставете в памет не е желателно. При използване на DataReader съхраняват в паметта в същото време не повече от един запис с източника.

DataReader може да се свързва само с една контрол на формата.

DataReader винаги работи по-бързо и използва по-малко памет, отколкото набор от данни.

В ADO.NET предвижда два вида DataReader: SqlDataReader и OleDbDataReader. Попълването на тези два обекта се извършва като се използва същият метод ExecuteReader.

DataReader Основната разлика се състои в това, че за разлика с DataAdapter, където се отваря връзката и затваря автоматично, когато DataReader за отваряне и затваряне на сесията, ще трябва ръчно.

Обикновено DataReader или използвани в един цикъл, или е свързан с контролата. Въпреки това, кодът във всеки случай трябва да напишете на ръка.

Каква е последователността на работа с DataReader:

1) се отваря връзката към източника

2) създаване на Command обект

3) от обект създаден Command DataReader

4) извиква метод ExecuteReader

5) DataReader обект се използва в програмата

6) DataReader обект затваря

7) изключва от източника

"Създаване на връзка и командни обекти

Дим вр като нови SqlConnection _

( "Източник на данни = Localhost; комплексна безопасност = вярно;" _

Дим cmdAuthors като нови SqlCommand _

( "Изберете * от Автори", вр)

"Създаване на DataReader и показване на данни

Дим д-р Както SqlDataReader

Смятате Докато dr.Read ()

lstBuiltNames.Items.Add (DR ( "au_lname") + "," + _

"Близо DataReader и Connection

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

"Да се ​​използва върнатите данните в DataReaders

Хвани д Както Изключение

"Работете грешката

След метода на ExecuteReader се нарича, а DataReader автоматично се настройва позицията преди първия запис върнати.

За да всъщност достъп до данните чрез DataReader, можете да

Прочетете, за да се използва методът, в една линия. Този метод след DataReader на записи връща нула - тази стойност и възлага проверка в цикъла:

Смятате Докато dr.Read ()

lblName.Text = Р ( "au_fname")

извадка той данните се извършва просто се хареса на поле от нейното име или поредност, а можете да използвате и най-подходящия метод Get (GetString, GetDateTime, GetInt32 и т.н.)

lblName.Text = dr.GetString (1) + "" + _

Вземи метод с типа на данните е по-бързо, тъй като ADO.NET не е необходимо да се справят с типовете данни.

Затваряне на връзката ръчно, след като приключите с помощта на DataReader - задължително, защото в противен случай той ще остане висящ.

За удобство, информацията за дисплея, получен чрез DataReader препоръчва да се свързват към елемента за управление на формата (например, познатата DataGrid). Той използва същия контрол имот DataSource, като стойността на обекта, който се предава DataReader:

Дим вр като нови SqlConnection _

( "Източник на данни = Localhost; комплексна безопасност = вярно;" _

Дим cmdAuthors като нови SQLCommand _

( "Изберете * от Автори", вр)

"Обвърже DataReader на падащ списък

Дим д-р Както SqlDataReader