Gestione connessioni, datareader ecc. con ado.net

mercoledì 11 maggio 2011 - 10.05

trinity Profilo | Guru

Scusa Ale ho letto il tuo link e tra le note tradotto in italiano c'è scritto questo:

Attenzione
Si consiglia vivamente di chiudere sempre la connessione quando hai finito di usarlo in modo che la connessione verrà restituita al pool. È possibile farlo utilizzando il Close o Dispose metodi di connessione oggetto, oppure aprendo tutte le connessioni all'interno di un utilizzo dichiarazione in C #, o un utilizzo dichiarazione in Visual Basic. Le connessioni che non sono esplicitamente chiuse potrebbero non essere aggiunte o restituite al pool. Per ulteriori informazioni, vedere Istruzione using (Riferimenti per C #) o Procedura: eliminare una risorsa di sistema (Visual Basic) per Visual Basic.
Nota
Non chiamare Close o Dispose su una connessione , un DataReader , o qualsiasi altro oggetto gestito nel Finalize metodo della classe. In un finalizzatore, rilasciare solo le risorse non gestite che la classe controlla direttamente. Se la classe non è proprietaria di alcuna risorsa non gestita, non includere un Finalize metodo nella definizione della classe. Per ulteriori informazioni, vedere Garbage Collection .

Adesso mi sto confondendo le idee, ossia sulla prima nota si consiglia di utilizzare il metodo close o dispose, mentre sotto viene detto di non utilizzarlo su una connessione, un datareader o qualsiasi altro oggetto.....

Ora non so per capire ti posto un esempio....

IN questo mio caso:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

qui in teoria stando a quello che dice la seconda nota non dovrei utilizzare il db.close e il sqlcmd.dispose

allora mi domando perchè nella prima nota viene consigliato di effettuare il close o dispose.....per chiudere le connessioni....Dato che mi hai detto che è l'ado.net a farlo o sbaglio?
Parlo sempre su programmi lato desktop

Ciao e grazie
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>Adesso mi sto confondendo le idee, ossia sulla prima nota si
>consiglia di utilizzare il metodo close o dispose, mentre sotto
>viene detto di non utilizzarlo su una connessione, un datareader
>o qualsiasi altro oggetto.....
no, non dice così. Dice di non usarlo in un Finalize:
http://msdn.microsoft.com/en-us/library/system.object.finalize.aspx
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

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

trinity Profilo | Guru

Quindi scusa nell'esempio di codice che ti ho postato dovrei utilizzare il metodo dispose per per il command così rilascio le sue risorse e alla fine della transazione fare il close del db...oppure no? :( mi sa che sto facendo confusione.....
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>Quindi scusa nell'esempio di codice che ti ho postato dovrei
>utilizzare il metodo dispose per per il command così rilascio
>le sue risorse e alla fine della transazione fare il close del
>db...oppure no? :( mi sa che sto facendo confusione.....
è molto semplice, la using usala tranquillamente come proposto fino ad ora.
Se mai dovessi implementare il metodo finalize, lì non fare close.


--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

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

trinity Profilo | Guru

>>Quindi scusa nell'esempio di codice che ti ho postato dovrei
>>utilizzare il metodo dispose per per il command così rilascio
>>le sue risorse e alla fine della transazione fare il close del
>>db...oppure no? :( mi sa che sto facendo confusione.....
>è molto semplice, la using usala tranquillamente come proposto
>fino ad ora.
>Se mai dovessi implementare il metodo finalize, lì non fare close.

OK ma fino ad ora ho usato la using ma non non mai usato il close o dispose
per esempio in questo codice io scrivo così:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

se dovessi mettere il close ed il dispose dovrei aggiornarlo così:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

o sbaglio?



>Alessandro Alpi | SQL Server MVP
>MCP|MCITP|MCTS|MCT
>
>http://www.alessandroalpi.net
>http://blogs.dotnethell.it/suxstellino
>http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>OK ma fino ad ora ho usato la using ma non non mai usato il close o dispose
>per esempio in questo codice io scrivo così:

>o sbaglio?
la using, per le connection, fa anche la close.
Allora, ricapitoliamo, tenendo ben presente che il tutto non dipende dal tipo di progetto che scrivi:
- Using puo' essere usato solo con le classi che sono "Disposabili", ovvero che implementano la IDisposable
- Using lancia quindi sempre il metodo Dispose()
- Per le connessioni Using fa anche la Close implicita
- Se non usi la Using devi fare Close e Dispose
- Se non e' richiesto da particolari casistiche, apri la connessione appena prima di usarla e chiudila appena non ti serve piu'
- Esiste un connection pool gestito da ADO.Net che ti consente di non preoccuparti di overhead dovuti a riaperture di connessioni

direi che dopo queste sei a posto

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

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

trinity Profilo | Guru

>>OK ma fino ad ora ho usato la using ma non non mai usato il close o dispose
>>per esempio in questo codice io scrivo così:
>
>>o sbaglio?
>la using, per le connection, fa anche la close.
>Allora, ricapitoliamo, tenendo ben presente che il tutto non
>dipende dal tipo di progetto che scrivi:
>- Using puo' essere usato solo con le classi che sono "Disposabili",
>ovvero che implementano la IDisposable
>- Using lancia quindi sempre il metodo Dispose()
>- Per le connessioni Using fa anche la Close implicita
>- Se non usi la Using devi fare Close e Dispose
>- Se non e' richiesto da particolari casistiche, apri la connessione
>appena prima di usarla e chiudila appena non ti serve piu'
Capito tutto...però in questo punto non mi è chiaro ossia se io uso la usign e quindi in maniera implicita effettua la close del db ed il dispose....quindi questo punto in cui dici di chiudere la connessione quando non mi serve + non serve perchè tanto la chiusura la fa la using, giusto?

>- Esiste un connection pool gestito da ADO.Net che ti consente
>di non preoccuparti di overhead dovuti a riaperture di connessioni
>
>direi che dopo queste sei a posto
>
>--
>Alessandro Alpi | SQL Server MVP
>MCP|MCITP|MCTS|MCT
>
>http://www.alessandroalpi.net
>http://blogs.dotnethell.it/suxstellino
>http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>Capito tutto...però in questo punto non mi è chiaro ossia se
>io uso la usign e quindi in maniera implicita effettua la close
>del db ed il dispose....quindi questo punto in cui dici di chiudere
>la connessione quando non mi serve + non serve perchè tanto la
>chiusura la fa la using, giusto?
si', ma anche metterla non fa male, non danneggia nulla
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

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

trinity Profilo | Guru

OK!!! ma tu per una cosa migliore metteresti il db.close e il command.dispose oppure no?

Grazie Ale per l'aiuto ;)
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>OK!!! ma tu per una cosa migliore metteresti il db.close e il
>command.dispose oppure no?
dio mio se lo fa non metterlo.. fai debug, tracci le risorse e vedi cosa cambia mettendolo.
Ci sono tool che ti permettono di vedere che succede in memoria..
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

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