NullReferenceException su chiusura di connessione MySql

martedì 11 dicembre 2012 - 18.20
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  MySQL 5.5

PR Profilo | Junior Member

Ciao a tutti
guardando l'Event Viewer sul mio server noto che la mia applicazione sviluppata in asp.net ogni tanto lancia degli Warnign che hanno come tipo di eccezione
la NullReferenceException.
Ma se io ho un codice scritto in questo modo
Try my_connection.open() .... .... Catch .... Finally my_connection.close() End try
Dove my_connection è un oggetto di tipo MySqlConnection

come fa ad andare in Waring? la connessione dovrebbe esistere in teoria.
Grazie

alx_81 Profilo | Guru

>Ciao a tutti
ciao

>come fa ad andare in Waring? la connessione dovrebbe esistere in teoria.
controlla se l'oggetto è null prima, nella finally soprattutto

>Grazie
di nulla!
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

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

PR Profilo | Junior Member

Ciao
nella giornata ho provato a fare il debug questa eccezione è capitato sporadicamente, la maggior parte delle volte arriva al finally con la connessione aperta e la chiude..non so cosa possa essere.
Una caso che mi era capitato (e che ho risolto) è stato il seguente: quando il sorgente arrivava al my_connection.open() aveva già una connessione aperta, e quindi lanciava un eccezione..anche in questo caso, però, l'oggetto non era null ma aveva come stato open

alx_81 Profilo | Guru

>Ciao
ciao

>nella giornata ho provato a fare il debug questa eccezione è
>capitato sporadicamente, la maggior parte delle volte arriva
>al finally con la connessione aperta e la chiude..non so cosa
>possa essere.
Per evitare problemi di connessioni aperte, utilizza il costrutto using:
http://msdn.microsoft.com/it-it/library/yh598w02(v=vs.100).aspx
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

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

PR Profilo | Junior Member

Dovrei quindi fare
using (my_connection.open()) { ... }

ma in questo caso se poi succede un'eccezione all'interno dell'usign lui la chiude da solo oppure poi devo comunque buttare tutto in un try catch?
Grazie

alx_81 Profilo | Guru

>Dovrei quindi fare
>using (my_connection.open())
no,
using (var my_connection = new MySqlConnection())

>ma in questo caso se poi succede un'eccezione all'interno dell'usign
>lui la chiude da solo oppure poi devo comunque buttare tutto
>in un try catch?
considera che la using ti fa la dispose, il try catch lo metterei cmq. Però la using ti garantisce il dispose e la close della connection.

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

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

PR Profilo | Junior Member

quindi diciamo che ad ogni utilizzo io dichiaro una nuova connessione!
Ok allora provo questa soluzione (visto che sicuramente sei più esperto di me la prendo come "soluzione migliore"), io ora ne avevo solo una, che aprivo e chiudevo ogni volta.
Grazie

alx_81 Profilo | Guru

>quindi diciamo che ad ogni utilizzo io dichiaro una nuova connessione!
>Ok allora provo questa soluzione (visto che sicuramente sei più
>esperto di me la prendo come "soluzione migliore"), io ora ne
>avevo solo una, che aprivo e chiudevo ogni volta.
è corretto aprire e chiudere ogni volta che la connessione ti serve.. però utilizza la using che ti toglie dei problemi di gestione.
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

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

PR Profilo | Junior Member

Sisi ma quello che dico io è che usando la using tutte le volte andrei a crearmi una nuova connessione definita solo all'interno dell'using, che poi io apro e chiudo quando mi serve.
Quindi,operativamente, in ogni sub che uso (che necessita una connessione al database) io metterei un using (contenuto in un try catch) e all'interno faccio le operazioni che devo fare, giusto?

O il try è meglio metterlo nell'using?

Grazie

alx_81 Profilo | Guru

>O il try è meglio metterlo nell'using?
no, fuori va bene

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

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

PR Profilo | Junior Member

Ciao sto provando a seguire il tuo consiglio e fare un refactoring del codice usando la using ma tutte le volte che scrivo questa riga di codice

Using (my_connection = New MySqlConnection(my_mysql_string_remote))

Mi genera un'errore perché mi dice che l'operatore = non è definito per gli oggetti MySqlConnection, se sposto la riga fuori dall'using invece me la da buona..

alx_81 Profilo | Guru

>Mi genera un'errore perché mi dice che l'operatore = non è definito
>per gli oggetti MySqlConnection, se sposto la riga fuori dall'using
>invece me la da buona..
prova:
Using tuavar As New MySqlConnection(tuastringa)
' bla bla bla
End Using
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi

PR Profilo | Junior Member

Ora non mi da errore, grazie
Ma così facendo, in caso di un eventuale eccezione finisco comunque nel catch (e fino a qua va bene) ma poi come fosso fare una close se comunque la variabile connessione è limitata all'using? (metto una close solo al termine dell'using visto che la visilibità è limitata?)
Grazie

alx_81 Profilo | Guru

>Ora non mi da errore, grazie
>Ma così facendo, in caso di un eventuale eccezione finisco comunque
>nel catch (e fino a qua va bene) ma poi come fosso fare una close
>se comunque la variabile connessione è limitata all'using? (metto
>una close solo al termine dell'using visto che la visilibità
>è limitata?)
La using fa close e dispose in automatico..
tuttavia puoi controllare lo stato della sessione e chiuderla nella catch

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

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi

PR Profilo | Junior Member

Nel frattempo ho fatto qualche test e qualche controllo, se il try catch è fuori dalla using la variabile della connessione, creata con la using non si vede più ,quindi non credo che resti aperta in caso di errore..

alx_81 Profilo | Guru

>Nel frattempo ho fatto qualche test e qualche controllo, se il
>try catch è fuori dalla using la variabile della connessione,
>creata con la using non si vede più ,quindi non credo che resti
>aperta in caso di errore..
se provi a decompilare lo statement using vedrai perfettamente quello che al suo interno fa, e, per gli oggetti che implementano lo IDisposable, disalloca.
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/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