DataReader je brz (read-only, forward-only) kursor koji se pomera kroz skup zapisa. Kada se izvršava SQL komanda koja vraća skup zapisa koristi se objekat DataReader da bi se prošlo kroz zapise. Kada se pozove metoda ExecuteReader objecta SqlCommand vraća se objekat klase DataReader. Objekat SqlCommand u ovom slučaju može predstavljati bilo koju Select naredbu ili uskladištenu proceduru koja sadrži Select naredbu. Objekat DataReader poseduje strogo tipizirani metod da pročita vrednost određene kolone u tekućem zapisu. Kada se skup zapisa obrađuje korišćenjem objekta DataReader konekcija na bazu je zauzeta sve dok se objekat DataReader ne zatvori.
Svojstva i metode DataReader objekta
Metoda Read čita red iz skupa rezultata. Kada se prvi put pozove ova metoda Reader se pozicionira na prvi red rezultata. Metoda vraća vrednost true ukoliko ima još redova za čitanje ili false ukoliko se Redaer pozicionirao na poslednji zapis. Item svojstvo daje vrednost kolone sa specificiranim imenom ili pozicijom. Vraćene vrednosti su u izvornom formatu i potrebno je izvršiti njihovo kastovanje da bi mogle da se koriste. Item je indekser za DataReader objekat. Ako je aReader instanca DataReader -a onda se odgovarajućoj koloni pristupa sa aReader["ImeKolone"] ili aReader["PozicijaKolone"]. Objekat DataReader ima strogo tipizirane metode GetDateTime, GetDouble,GetInt32 itd. Ove metode se koriste kada se znaju tipovi podataka u zapisima. GetValues metoda vraća niz objekata koji sadrže vrednosti iz tekuće vrste. Metoda IsDbNull testira da je vrednost kolone u tekućem zapis null vrednost.
Primer upotrebe DataReader-a
Kreira se objekat DataReader pozivanjem metode ExecuteReader objekta cmd klase SqlCommand. Kao što se može uočiti objekat cmd predstavlja Select naredbu. Naredbom while (r.Read()) vrši se iteracija kroz sve redove dobijene izvršavanjem Select naredbe. Za svaki red iščitava se atribut(kolona) ContactName i dodaje u kombo boks. Na kraju se zatvara DataReader objekat i zatvara se konekcija.
string SQL = "SELECT ContactName FROM Customers";
SqlConnection con = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand(SQL, con);
SqlDataReader r = null;
try
{
con.Open();
r = cmd.ExecuteReader();
while (r.Read())
{
lstNames.Items.Add(r["ContactName"]);
}
}
catch (Exception err)
{
MessageBox.Show(err.ToString());
}
finally
{
if
(r != null)
r.Close();
con.Close();
}
Uskladištene procedure i DataReader
SqlCommand objekat u nastavku predstavlja uskladištenu proceduru CustOrderHist. Izvršavanjem uskladištene procedure CustOrderHist kao rezultat se dobija skup zapisa. Zato se koristi metoda ExecuteReader SqlCommand objekta. Korišćenjem while petlje čitaju se svi zapisi iz rezultujećeg skupa zapisa. Iz svakog zapisa čitaju se kolone Total i ProductName, kreira se string koji se dobija nadovezivanjem ove dve kolone i štampa se na standardnom izlazu.
string procedure = "CustOrderHist";
SqlConnection con = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand(procedure, con);
SqlDataReader r = null;// Konfiguriši komandu i dodaj parametar
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter param;
param = cmd.Parameters.Add("@CustomerID", SqlDbType.NChar, 5);
param.Value = "ALFKI";// Izvrši komandu
con.Open();
r = cmd.ExecuteReader();
while (r.Read())
{
Console.WriteLine(r["Total"].ToString() + " of " +
r["ProductName"].ToString());
}
U nastavku je dato telo procedure CustOrderHist koja je napravljena u bazi podataka Northwind na SQL Serveru da bi primer sa prethodnog slajda mogao da se isproba. Potrebno je još napraviti odgovarajuću konekciju na bazu podataka ili iz koda ili grafički.
CREATE PROCEDURE CustOrderHist
@CustomerID nchar(5)
AS
SELECT ProductName, Total=SUM(Quantity) FROM Products P,
[Order Details] OD, Orders O, Customers C
WHERE C.CustomerID = @CustomerID AND C.CustomerID = O.CustomerID
AND O.OrderID = OD.OrderID AND OD.ProductID = P.ProductID
GROUP BY ProductName GO
Metoda GetName DataReader-a vraća ime kolone sa specificiranom pozicijom. Metoda GetOrdinal vraća poziciju kolone sa specificiranim imenom. Metoda GetSchemaTablevraća objekat klase DataTable koja sadrži jednu vrstu za svaku kolonu u rezultujućem skupu zapisa, dok je kolone (atributi) te tabele bliže određuju.
U nastavku je prikazan primer čitanja metapodataka iz objketa DataReader. Korišćenjem metode GetSchemaTable dobijena je tabela sa metapodacima. Za svaku vrste te tabele pročitani su svi njeni atributi i prikazani na standardnom izlazu.
SqlDataReader r;
DataTable schema;
// Izvrsi upit
try
{
con.Open();
r = cmd.ExecuteReader();
schema = r.GetSchemaTable();
}
finally
{
con.Close();
}
foreach (DataRow row in schema.Rows)
{
foreach (DataColumn col in schema.Columns)
{
Console.WriteLine(col.ColumnName + " = " + row[col]);
}
Console.WriteLine();
}