[C#] Dichiarare un oggetto per tutte le classi

mercoledì 02 luglio 2008 - 09.28

Luka90 Profilo | Junior Member

Buongiorno a tutti!

Intanto mi scuso se magari la mia domanda pare ad alcuni banale, ma io ci stò impazzendo dietro ed essendo alle prime armi con la programmazione che si interfaccia ai database (la uso da 14 giorni) solo ora mi si sono presentate certe problematiche.

Il fatto è questo: ho creato una classe di "servizi" (metodi vari) che mi permettono tutto il dialogo con il database. Il problema è che in ogni form del programma dovevo cereare un oggetto di quella classe che eseguiva una nuova connessione al database, quindi fa impiegare al form del tempo per caricarsi, tutto lento insomma.

Ora, vorrei creare un oggetto solo che possa essere accessibile a tutte le classi o altrimenti mettere la classe a STATICA, ma la connessione non posso più crearla nel costruttore a quel punto ma esternamente, cosa che mi intralcia quando uso i Command e i DataReader...

Grazie da subito :)

Brainkiller Profilo | Guru

>Ora, vorrei creare un oggetto solo che possa essere accessibile
>a tutte le classi o altrimenti mettere la classe a STATICA, ma
>la connessione non posso più crearla nel costruttore a quel punto
>ma esternamente, cosa che mi intralcia quando uso i Command e
>i DataReader...

No infatti, in genere si definisce la classe come abstract (non instanziabile) e i metodi interni come static.
In questo modo puoi richiamarli in questo modo da codice:

NomeClasse.NomeMetodo(Parametri);

A questo punto puoi anche creare dei metodi che accettino in input un SqlCommand o una query semplice e restituiscano dei DataSet.

Esempio:

public static DataSet GetData(string query) { }

oppure

public static DataSet GetData(SqlCommand cmd) { }

così dal tuo codice esterno potrai usare brevemente:

DataSet ds=new DataSet(); ds=NomeClasse.GetData("SELECT * FROM Tabella");

e poi operi sul DataSet.

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

Luka90 Profilo | Junior Member

Intanto, grazie della tempestiva risposta

Il fatto è che la mia classe contiene già tutti i metodi (e sono anche tanti) che utilizzavano di volta in volta un nuovo Command con la query e che metteva il risultato in un DataReader. Nell'utilizzare il Command usavo un oggetto di tipo Connection definito nello stato.

class ClasseServizi
{
string connect="..." <--- stringa di connessione
OdbcConnection dati = new OdbcConnection(connect);

public ClasseServizi()
{
...
dati.Open();
}

metodo1(..){} ecc
}

Poi aprivo la connessione tramite l'apposito metodo quando costruivo un oggetto di tipo ClasseServizi.
Quello che volevo fare è eliminare la connessione dalla Classe, per eseguirla una sola volta (magari all'esterno?) per evitare di creare 5 conenssioni se uso la ClasseServizi in 5 form diverse (o classi che siano).

Altra soluzione sarebbe dichiarare un oggetto di ClasseServizi che possa essere "raggiungibile" da tutte le altre classi.

Forse il problema mi è gia stato risolto e non sono riuscito a cogliere la soluzione, ma prego di avere pazienza con un povero studente

Grazie ancora!
Luca

Brainkiller Profilo | Guru

>Poi aprivo la connessione tramite l'apposito metodo quando costruivo
>un oggetto di tipo ClasseServizi.
>Quello che volevo fare è eliminare la connessione dalla Classe,
>per eseguirla una sola volta (magari all'esterno?) per evitare
>di creare 5 conenssioni se uso la ClasseServizi in 5 form diverse
>(o classi che siano).

Questo non credo sia un problema perchè c'è il connection pooling, che crea un tot di connessioni al DB e riutilizza sempre quelle non creando overhead.
Leggiti magari questo se vuoi capire meglio:
http://www.wintellect.com/Articles/ADO%20NET%20Connection.pdf
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

Luka90 Profilo | Junior Member

>Questo non credo sia un problema perchè c'è il connection pooling,
>che crea un tot di connessioni al DB e riutilizza sempre quelle
>non creando overhead.
>Leggiti magari questo se vuoi capire meglio:
>http://www.wintellect.com/Articles/ADO%20NET%20Connection.pdf
>Ciao

Cribbio, allora non è quello che rallenta così tanto il caricamento delle mie form...
Credevo fosse colpa della classe che quando costruivo un oggetto creava una nuova connessione (e a dirla tutta credo ancora che il problema sia quello).

Insomma per logica, un programma apre la connessione al database appena parte e poi tramite dei metodi ci agisco leggendo, inserendo ecc ecc... Mi sembra impossibile che per ogni form mi tocca dover ricreare un oggetto della classe che mi fa questo servizi. Se la mettessi a Static per evitare il costruttore non mi aprirebbe nessuna connessione.

Avevo fatto delle prove in un progetto vuoto, aprendo con un pulsante una nuova form (dichiaravi la nuova form e poi .Show() ) e va MOLTO più veloce di come va a me ora.

Grazie mille però Davvero illuminante!
Luca
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5