Classe che restituisce un gruppo di record

martedì 01 luglio 2008 - 16.25

kduhcm Profilo | Junior Member

Ciao ragazzi,
vorrei fare una classe generica che prenda in input una query "select * from ... " e mi restituisca i record su cui il chiamante ciclera'.
Ho creato un metodo che restituisce un data reader, ma non e' la soluzione ottimale in quanto cosi' anche il chiamante del metodo deve aprire e
chiudere la connessione al database. Avete qualche idea migliore e di veloce implementazione (postate il codice grazie )?

questa e' il metodo attuale che vorrei migliorare ...

public OdbcDataReader executeQueryLista(OdbcConnection conn)
{
OdbcCommand cmd = new OdbcCommand();
//cmd.Connection = new OdbcConnection(_stringaConnessione);
cmd.Connection = conn;

cmd.CommandText = _querySql;

try
{
OdbcDataReader dr1 = cmd.ExecuteReader();
return dr1;
}
finally
{
//cmd.Connection.Close();
// connessione chiusa (e aperta) dal chiamante
}
}

Brainkiller Profilo | Guru

>Ciao ragazzi,
>vorrei fare una classe generica che prenda in input una query
>"select * from ... " e mi restituisca i record su cui il chiamante
>ciclera'.

Ciao,
puoi restituire un DataSet che viene usato proprio nella nota modalità disconnessa, apri connessione recuperi i record e rimpi il DataSet e lo restituisci chiudendo la connessione. A questo punto hai tutti i dati e fai quello che vuoi, puoi filtrarli per esempio con una DataView.

In molti casi il DataSet può non essere la scelta migliore perchè in presenza di molti record può decrementare le prestazioni generali dell'applicazione, magari puoi usare una classe tipizzata e restituire quella.
Ciao

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

kduhcm Profilo | Junior Member

Ciao...
Scusa l'ignoranza... con tipizzato credo che si intenda un oggetto di cui si conosce i campi da cui e' formato (correggimi se sbaglio). Il mio scopo e' di isolare i comandi di accesso al database, quindi non so a priori cosa devo restituire... Attualmente restituisco un datareader con i campi relativi alla query che mi e' passata (vedi funzione che ti ho allegato precedentemente). Se il dataset rallenta le prestazioni rispetto al datareader forse e' meglio che eviti di utilizzarlo... Non c'e' una soluzione performante come il data reader che eviti al chiamante del metodo di dover aprire e poi chiudere la connessione?

Anonimo Profilo | Senior Member

Non ho mai visto in vita mia un rallentamento restituendo un dataset anche analizzando circa 1000000 di dati a query, tolto il tempo di estrazione dei dati vero e proprio e dipende solo dai server e dalla banda, direi che è la scelta in assoluto migliore, è molto flessibile, disconnessa e sopratutto con accesso casuale.
Io voto l'utilizzo del dataset, anche perchè con una buona programmazione usi l'oggetto sqlbuilder e le query le genera lui.

Team Icon - Software Engineering
------------------------------
Unicredit Global Information Services Spa
Chief Solution Architect

Brainkiller Profilo | Guru

>Se il dataset rallenta le prestazioni rispetto al datareader forse e' meglio
>che eviti di utilizzarlo... Non c'e' una soluzione performante

Non sempre rallenta dipende dalla mole di dati, più che altro riempie anche la RAM e dipende da quanti utenti contemporanei usano il software.

>come il data reader che eviti al chiamante del metodo di dover
>aprire e poi chiudere la connessione?

Se il tuo problema sono le connessioni questo è un falso problema. Leggiti il mio intervento quando si parla di Connection Pooling qui:
http://www.dotnethell.it/forum/messages.aspx?ThreadID=23889

Ciao

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

Brainkiller Profilo | Guru

>Non ho mai visto in vita mia un rallentamento restituendo un
>dataset anche analizzando circa 1000000 di dati a query, tolto

Ciao Team,
su questo non concordo con te. Forse presso Unicredit avete RAM da buttare e avete server con 64 Gb di RAM ?
Prova a pensare un DataSet così enorme eseguito da una trentina di utenti simultaneamente cosa succede ?

>è molto flessibile, disconnessa e sopratutto con accesso casuale.
>Io voto l'utilizzo del dataset, anche perchè con una buona programmazione
>usi l'oggetto sqlbuilder e le query le genera lui.

Su questo siamo d'accordo.
Ciao

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

alx_81 Profilo | Guru

>Non c'e' una soluzione performante
>come il data reader che eviti al chiamante del metodo di dover
>aprire e poi chiudere la connessione?
Guarda, aprire e chiudere una connessione non è un problema, c'è il Connection Pooling..
Leggi pure il link che ti ha dato David, spiega perfettamente perchè è un "falso problema".

@Team
>Non ho mai visto in vita mia un rallentamento restituendo un dataset anche analizzando circa 1000000 di dati a query, tolto il tempo di estrazione dei >dati vero e proprio e dipende solo dai server e dalla banda, direi che è la scelta in assoluto migliore, è molto flessibile, disconnessa e sopratutto con >accesso casuale.
>Io voto l'utilizzo del dataset, anche perchè con una buona programmazione usi l'oggetto sqlbuilder e le query le genera lui.
Ciao, vorrei farti notare che la vera pesantezza del dataset, sta nel fatto che per ogni campo di ogni datatable, viene salvata una triade di valori.
E' decisamente pesante, e non è un caso che anche MS abbia iniziato a ragionare ad entità, addirittura sconsigliando l'utilizzo dei dataset in generale.
E' molto meglio, nella maggior parte dei casi, farsi un layer di classi atte a ragionare ad entità. Non è un must e non sempre è per forza la soluzione migliore. Ma su macchine non troppo potenti la modalità disconnessa a dataset appesantisce, e non di poco, le esecuzioni.
Vedendo dalla tua firma, probabilmente i vostri server non hanno problemi di sorta, visto che se spendi molto sui server, puoi arrivare ad avere un 16 processori dual core, una SAN a fibre ottiche con Storage Array infiniti e ridondanti, RAM a non finire..
Insomma. Così è troppo facile dire che non ci sono differenze.. sul mio pc di sviluppo, ci sono e sono pure tante. Sui serverini di produzione che si trovano nella maggior parte delle realtà, è buona cosa pensare di cambiare metodo di ragionamento e di sviluppo.
Questa è la mia opinione..

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Anonimo Profilo | Senior Member

Non abbiamo nulla di speciale a parte le portanti da 2 Mb garantiti, 4gb di ram e 4 server in parallelo. Ma ripeto fin'ora non mi è mai capitato di vedere rallerntamenti e di utenti in simulatenea ce ne sono parecchi, però posso sbagliarmi nel nostro lavoro credo non si smetta mai di imparare no?
Team Icon - Software Engineering
------------------------------
Unicredit Global Information Services Spa
Chief Solution Architect

alx_81 Profilo | Guru

>Non abbiamo nulla di speciale a parte le portanti da 2 Mb garantiti,
>4gb di ram e 4 server in parallelo. Ma ripeto fin'ora non mi
>è mai capitato di vedere rallerntamenti e di utenti in simulatenea
>ce ne sono parecchi, però posso sbagliarmi nel nostro lavoro
>credo non si smetta mai di imparare no?
certo.. però sui numeri che hai fatto, proverei ancora. E in concurrency secondo me le differenze le trovi
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

kduhcm Profilo | Junior Member

Ciao ragazzi, ringrazio tutti voi per la partecipazione...

>>>Se il tuo problema sono le connessioni questo è un falso problema....

In realta' volevo evitare di aprire la connessione nel chiamante del metodo per un discorso di incapsulamento della programmazione:
fa tutto il metodo della classe e il chiamante del metodo deve solo ciclare sui record restituiti... comunque volevo anche un parere sulla funzione che ho scritto in apertura del thread, sia dal punto di vista dello stile di programmazione che da quello prestazionale... e' passabile o fa veramente piangere?

alx_81 Profilo | Guru

> comunque volevo anche un
>parere sulla funzione che ho scritto in apertura del thread,
>sia dal punto di vista dello stile di programmazione che da quello
>prestazionale... e' passabile o fa veramente piangere?
Per quanto riguarda la tua funzione, prestazionalmente, non fa altro che eseguire una query e tornare un data reader. L'unica cosa che posso dirti è che se puoi cambiare il provider è meglio. Usare, se possibile, OLEDB o, se hai SQL Server, il SQLCLient.
Magari, cerca di usare l'operatore using per gli oggetti che implementano la IDisposable (oggetti che hanno il metodo dispose):

Using Statement
http://msdn.microsoft.com/en-us/library/yh598w02.aspx

Tornando alla filosofia ad entità, posso consigliarti di farti una classe che apre la connessione al db, che sarà la base di tutte le altre (ovvero le entità).
Ognuna delle classi entità eredita da quella base e avrà n metodi. Alcuni faranno le operazioni DML (UPDATE, INSERT, DELETE) ed altri le letture (SELECT) popolando degli oggetti collezione.

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

kduhcm Profilo | Junior Member

>> ... L'unica cosa che posso dirti è che se puoi cambiare il provider è meglio. Usare, se possibile, OLEDB o, se hai SQL Server, il SQLCLient. ...

sto utilizzando MySql... sto lavorando per una societa che usa solo asp e sono impreparati sul discorso asp.net anche per quanto riguarda i driver...
ho trovato degli esmpi di codice che utilizzavano Systema.Data.Odbc e quindi ho utilizzato questa libreria...

alx_81 Profilo | Guru

>sto utilizzando MySql... sto lavorando per una societa che usa
>solo asp e sono impreparati sul discorso asp.net anche per quanto
>riguarda i driver...
>ho trovato degli esmpi di codice che utilizzavano Systema.Data.Odbc
>e quindi ho utilizzato questa libreria...
puoi aiutarli tu allora

Io utilizzerei il connector nativo di MySQL:
http://dev.mysql.com/downloads/connector/net/5.1.html

puoi basarti su questo link per la corretta connection string:
http://www.connectionstrings.com/?carrier=mysql

ciao!

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5