Член DataReader и достъп до данни

DataReader и достъп до данни

В следващата статия в тази серия ще разгледаме първият обект, който ще ни позволи да осъществите достъп до данните, съхранявани в релационна база данни, - DataReader.

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


Както бе споменато по-рано, ако в резултат на SQL команди чрез командата е набор от данни, в резултат на метода Command.ExecuteReader създаде DataReader. чрез която можете да получите достъп до резултат.

В същността си това е DataReader записи поток, само за четене, в който можете да се движат само напред, последователно от запис, за да записвате. Работата с тях е много подобен на четене на данни от последователен файл.

В процеса на четене по всяко време в паметта на компютъра на клиента е един и само текущият запис. Затова DataReader изисква много малко памет на клиента, дори ако общият размер на данните на извадката е голям.

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

Тези характеристики DataReader наложат определени ограничения върху методи за използване на обекта. Въпреки това, има много приложения, за които тази функционалност е достатъчно. Например, ако искате да изберете някои данни от базата данни и ще го покаже доклада под формата на списък, а DataReader доста успешно се справи с този проблем, не зарежда с паметта на компютъра на клиента, дори и ако се наложи да се справят значително количество данни.

DataReader подкрепа от страна на сървъра  Ако вече сте се справиха по-рано с бази данни чрез ADO, OLE DB или ODBC, без съмнение сте запознати с концепцията на курсора.

В ADO.NET, ние очевидно не са отговори на концепцията за курсора, тъй като няма Recordset. който е директно свързан с него. Въпреки това, по-ниско ниво, разбира се, на принципа на взаимодействие с сървъри на база данни не са се променили, и курсори, все още съществуват, макар и да е скрито от програмиста.

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


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

DataReader се създава като се обадите на метод обект ExecuteReader команда:


OleDbDataReader myReader = myCommand.ExecuteReader (CommandBehavior.CloseConnection);


След това можете да започнете да работите с обекта.

Броят на редовете се променили, добавя или заличава, тъй като в резултат на изявление на SQL.

Дълбочина има смисъл, ако низ принадлежи на набор от йерархична (както чрез OLE DB, можете да получите достъп не само до релационни бази данни). MS SQL Server не поддържа йерархия, така SqlDataReader.Depth винаги се връща 0.

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


Int I = (междинно съединение) myReader.Item [1];

низ S = (стринг) myReader.Item [Име];


(Разбира се, при условие, че вида на правилата за преобразуване не се нарушават).

Премества към следващия запис

Затваряне - излиза DataReader. Не забравяйте да се обадите на този метод, когато приключите с обекта, в противен случай връзката обект Оутс недостъпни за други операции на източника на данни.

GetDataTypeName и GetFieldType възможно да се определи името на типа данни и реалното тип данни колона с предварително определен брой.

GetName и GetOrdinal се допълват. Първият ви позволява да укажете името на колона от неговия номер, а втората, съответно, от името на номера на колоната.

IsDBNull всъщност е единственият начин да се определи това, което се съхранява в тази графа празна, защото сред тип данни .NET Framework тип линия, подходяща за представяне.

NextResult използва, за да преминете към следващия набор от данни, ако отчета за SQL запомнени процедури или се връща като резултат от множество набори от данни. Първоначално DataReader е разположен на първия сет, за достъп до следната необходимо ясно прехода.

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


В допълнение към тези методи, DataReader включва и набор от методи за достъп до стойностите на колоните, които връщат стойност от посочения тип. Използването на тези методи е тривиален и както е видно от името, така че аз просто ще ги посочим в таблицата за справка:


Освен тях, изпълнението на SqlDataReader включва и набор от методи, които връщат специфични видове MS SQL Server. Тъй като те са основно дублира общи типове данни, не виждам причина да живеете тук, на вниманието.


В последната статия бяхме принудени да направите, без примера на изпълнението на програмата, тъй като те не разполагат с необходимите средства, за да имат достъп до резултатите от заявката към базата данни. Сега е времето да се консолидират на практика уменията научени в изследването на материала и последната от тази статия. Ние ще създадем един прост, но пълно заявление, което първоначално показва списък от държави, в които има клиенти Northwind хипотетична фирма, ни приканва да въведете името на една страна, а след това се показва списък с клиенти, които живеят в страната.

Разбира се, много по-лесно да се изгради такива приложения с много помощници, които са готови да се улесни работата си, което позволява на няколко кликвания на мишката, за да създадете цели участъци от крайния код. Въпреки това, за да се опише работата с тях, а неблагодарна задача, тъй като ясно да представя по думите на последователността от движения и кликвания с мишката не са толкова прости, и елементарно нагоре по история дълга серия от снимки на екрани не искате да. Ето защо, за пример е конзолно приложение, където копия на цялата необходима за обекти с данни са създадени непосредствено преди употреба чрез софтуер. Въпреки че е малко по-тромава при разработването на приложения, но такъв код може да се използва дори и от тези, които не са в състояние да използват IDE VS.NET и трябваше да се задоволи работа с C # компилатор от Рамката на .NET чрез командния ред.

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

Въпреки своята простота, програмата включва всичко необходимо, за да се изгради проста изложение на съдържанието на базата данни: създаване на връзка, на изискванията за данни (прости и параметризирани), на изхода на данните, които се разпределят връзката с източника на данни и освобождаването на ресурси.

използване на системата;
използване System.Data;
използване System.Data.OleDb;

пространство от DataReaderSample
клас DataReaderSample
[STAThread]
статично невалидни Майн (струнен [] аргументи)
Console.WriteLine ( "Command DataReader Примерна програма \ Н ") .;
// създаване и отворена връзка
низ strCnn = @ "Доставчик = Microsoft.Jet.OLEDB.4.0; Data Source = C: \ Program Files \ Microsoft Visual Studio \ VB98 \ NWIND.MDB";
OleDbConnection CNN = нов OleDbConnection ();
cnn.ConnectionString = strCnn;
cnn.Open ();

// създаване на Command
OleDbCommand CMD = нов OleDbCommand ();
cmd.Connection = CNN;

// първо изберете всички страни, в които има клиенти
низ strCmd = "SELECT DISTINCT Държава от клиенти ORDER BY Country";
cmd.CommandText = strCmd;
cmd.CommandType = CommandType.Text;

OleDbDataReader RDR = cmd.ExecuteReader ();
// показване на списъка с държави,
Console.WriteLine ( "Списъкът на държавите, клиенти живеят в");
докато (rdr.Read ())
// използва резултата номер на колона последователност
Console.WriteLine (rdr.GetString (0));
rdr.Close (); // не забравяйте да затворите DataReader след употреба!
Console.WriteLine ();

Console.Write ( "Изберете едно искате да получите списък с клиенти от:");
низ ANS = Console.ReadLine ();

// сега се опитваме да изградим и изпълнение на заявка с параметър
strCmd = "SELECT ContactName, CompanyName, ContactTitle от клиенти КЪДЕ (Държава =?)";
cmd.CommandText = strCmd;
OleDbParameter ал = нов OleDbParameter ();
par.OleDbType = OleDbType.VarWChar;
par.Value = ANS;
cmd.Parameters.Add (PAR);

RDR = cmd.ExecuteReader ();
Console.WriteLine ( "Клиентите от" + ANS + "са:");
докато (rdr.Read ())
// в този случай, за най-различни имена използване на колони в базата данни, а не на техните номера
Console.WriteLine (RDR [ "ContactName"]. ToString () + ","
+ RDR [ "CompanyName"]. ToString () + ","
+ . Rdr [ "ContactTitle"] ToString ());

// ресурси освобождаване (въпреки че те автоматично се освободи в края на програмата,
// още по-добре свикнали да ги освободи изрично веднага след употреба)
rdr.Close ();
cnn.Close ();