[ 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.