[ Laki123 @ 27.05.2010. 09:06 ] @
| Interesuje me da li je dobro koristiti statičku klasu za pristup bazi podataka (koje su prednosti i mane). U svojoj veb aplikaciji koristim sledeću klasu za rad sa bazom.
Code (csharp):public static class Baza
{
public static OleDbCommand KreirajKomandu (string KonekcijskiString )
{
string strKonekcija = ConfigurationManager .ConnectionStrings[KonekcijskiString ].ConnectionString;
OleDbConnection OleDbKonekcija = new OleDbConnection (strKonekcija );
OleDbCommand komanda = OleDbKonekcija .CreateCommand();
return komanda ;
}
public static DataTable IzvrsiSqlUpit (OleDbCommand komanda )
{
DataTable rezultat = new DataTable ();
try
{
komanda .Connection.Open();
OleDbDataReader citac = komanda .ExecuteReader();
rezultat .Load(citac );
citac .Close();
}
catch
{}
finally
{
if (komanda .Connection.State == ConnectionState .Open)
komanda .Connection.Close();
}
return rezultat ;
}
public static void IzvrsiSqlKomandu (OleDbCommand komanda ) //update,insert,delete
{
try
{
komanda .Connection.Open();
komanda .ExecuteNonQuery();
}
catch
{}
finally
{
if (komanda .Connection.State == ConnectionState .Open)
komanda .Connection.Close();
}
}
}
U samom programu nije potrebno svaki put ponavljati kod za otvaranje i zatvaranje konekcije i korišćenje iste konekcije. Ovo je ujedno i jedna od prednosti korišćenja ovog pristupa.
Code (csharp):OleDbCommand komanda = Baza.KreirajKomandu("KonekcijskiString");
komanda.Parameters.AddWithValue("Ime", TextBox1.Text);
komanda.Parameters.AddWithValue("Prezime", TextBox2.Text);
komanda.CommandText = "INSERT INTO Tabela(Ime,Prezime) VALUES(?,?)";
Baza.IzvrsiSqlKomandu(komanda);
|
[ dejanet @ 29.05.2010. 08:54 ] @
Glavna osobina static class-a je da se ne mogu instacirati i da su u okviru nje dozvoljeni samo static members, tako da u 90% slucajeva nije pogodna za web aplikaciju u kombinaciji sa bazom podataka.
Zasto?
U opsteno, svaka poseta web aplikaciji i/ili web request web strane inicira brisanje page context objekata(starih) i kreiranje novih, tj http je stateless(ne pamti state stanje), da bi mogao da skalira hiljade paralelnih requesta, znaci brise klase. U ASP.NET-u ima razlicitih tehnika kako da se radi u view state-u,session state-u i application state-u....
Static class-e se ne mogu instacirati u opste,pa po paralelnim requestima u tvom slucaju DataTable rezultat ce uvek imati POSLEDNJU kolekciju podataka kroz sve web requeste.
Tesko se primeti u toku razvoja, npr: otvoris 2 paralelna requesta na strani razlicitom kolekcijom podataka, I req- grupa proizvoda A, II req- grupa proizvoda B, ako se potrefi tajming kod I requesta mozes dobiti listing B grupe proizvoda umesto A (kod static klasa).
E sad static klase se mogu koristiti na nivou cele web aplikacije(umesto app. settingsa), dok se za per client pristup koriste sesije kao container za objekte svih vrsta i citljivi su iz svih strana/view state-ova PO KLIJENTU(user-u)..
[ Laki123 @ 29.05.2010. 10:21 ] @
Zahvaljujem na odgovoru.
Nekako mi je logično sve to što si rekao, zato sam i imao dilemu da li je ovo dobar pristup.
Ovo pitanje sam postavio, zato što sam nailazio na slične primere, npr. u knjizi "Beginning ASP.NET E-Commerce in C# From Novice to Professional", kao i na stranici
A simple 3-tier layers application in ASP.NET
[ dejanet @ 29.05.2010. 12:16 ] @
Citat:
Ovo pitanje sam postavio, zato što sam nailazio na slične primere, npr. u knjizi "Beginning ASP.NET E-Commerce in C# From Novice to Professional", kao i na stranici A simple 3-tier layers application in ASP.NET
Bacio sam pogled, cini mi se da njihov kod pisan po uzoru na singleton pattern(mozda gresim), koji po meni neupotrebljiv u web aplikacijama, moje misljenje, osim kao static za globalne objekte, van konteksta requesta..
Inace slobodno eksperimentisi, pogledaj malo patterne, jer ce ti cela ova prica mnogo znaciti u samom radu..
[ mmix @ 29.05.2010. 12:21 ] @
Pazite na threadsafety sa statickim klasama/metodama.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.