44 messaggi dal 04 giugno 2001
Ciao a tutti.
Vorrei una vostra opinione a proposito di una scelta che vorrei fare per un applicazione già funzionante in fase di restyling del codice...
L'applicazione in questione accede più volte al database (MsSql) e fino ad ora aprivo la connessione al db al inizio di esecuzione dei script e la chiudevo alla fine. Rimuginando e modificando il toto ho avuto la neccesità di convertire una serie di blocchi di codice in funzioni e qui mi sono accorto di dover aprire la connessione per ogni funzione...

Attualmente ho creato un modulo all'interno del quale ho provato ad inserire la seguente:


Function recuperaDatiDb(ByVal query As String) As SqlClient.SqlDataReader
Dim objConnection As SqlClient.SqlConnection = New SqlClient.SqlConnection(ConfigurationSettings.AppSettings("xxxx"))
objConnection.Open()
Dim cmdCheck As SqlClient.SqlCommand = New SqlClient.SqlCommand(query, objConnection)
Dim rsCheck As SqlClient.SqlDataReader
recuperaDatiDb = cmdCheck.ExecuteReader()
End Function

Funziona e mi fa risparmiare una marea di righe.

La funziona la richiamo quando mi serve un interrogazione:

Dim rsQualcosa As SqlDataReader = Libreria.recuperaDatiDb("select * from tabella where qualcosa")

(dove Libreria è il nome del modulo...)

La domanda è seguente: come si comporteranno le connessioni al db con questo codice ? Anzi... facciamo una domanda un po' diversa: conviene strutturre le interrogazioni in questo modo o c'è qualche controindicazione....

Se avete qualche consiglio ve ne sarei grato ..
Ciao

Marczewski Rafal
3.939 messaggi dal 28 gennaio 2003
Una funzione simile, vista a suo tempo in un libro, l'ho anchio in un modulo ma mi guardo bene da utilizzarla. La lascio lì solo per ricordarmi ciò che non si deve fare.
Io credo che un qualunque metodo di database, debba:
1) aprire la connessione
2) aprire il reader
3) estrarre i dati e manipolarli
4) chiudere il reader
5) chiudere la connessione

In altre parole, se apro una connessione, la debbo chiudere assolutamente il più presto possibile.

Un modo potrebbe essere quello di sostituire:
recuperaDatiDb = cmdCheck.ExecuteReader() con
recuperaDatiDb = cmdCheck.ExecuteReader(CommandBehavior.CloseConnection)
che mi assicura la chiusura della connessione quando si chiude il reader

Un altro modo sarebbe quello di avere un oggetto connessione esterno alla funzione in modo da chiuderlo fuori dalla funzione quando il reader non serve più.

Ma, ti ripeto, non mi piace quest'uso.

Per esempio, io farei funzioni di uso universale, come quella che mi permette di caricare un DropDown da una tabella, oppure una funzione che mi popola una griglia con l'uso del reader.

Comunque, se non sono stato chiaro, credo di ricordare che c'è una risposta di Ricciolo ad un argomento simile di qualche mese fa, sicuramente più chiara e completa della mia.

Ciao e fai sapere.
e aggiungo..
che già a monte dovresti progettare la tua applicazione in modo che meno connessioni tu faccia e sfruttare magari più result sets sia la cosa migliore.
In alternativa, puoi sfruttare il Connection Pooling, già attivo di default, almeno per SqlServer, per MySql non lo so.
In pratica, apre un tot di connessione da subito e nel momento in cui ti serve te ne dà una da usare, nel momento in cui fai close, in realtà non viene chiusa ma resta a disposizione per qualcun'altro che lo possa richieredere, il tutto cambiando una opzione nella connection string.

Ciao

Il mio blog
Homepage
327 messaggi dal 06 settembre 2002
ciao questo tipo di codice è quello chi io uso in modo standard quando devo leggere dei dati velocemente, a me sembra che non ci siano contrindicazioni unica cosa è quella di usare:

Dim result As OleDbDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)

Return result

questo modo di operare è quello illustrato dal portale ibuyspy o dal libro della orealy professinal aspnet.
ciao

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.