Riferimento a un oggetto non impostato su un'istanza di oggetto

mercoledì 23 gennaio 2008 - 16.27

ravalon Profilo | Expert

Salve a tutti...
ho un quesito per voi...

Ho due classi da me costruite

ClassConnessione
ClassGenerale

LA prima ha tutti i metodi per richiamare la connessione ed estrarre i dati
La seconda ha delle routine generiche che via via mi servono

Richiamo questi metodi facendo una cosa del tipo

Dim Conn as new ClassConnessione
Conn.ConnettiMysql ...etc.etc

Cosi funziona benone...

Volevo però non dover dichiarare ogni volta un nuovo oggetto che punta alla Classe, cosi ho pensato di inserire in un MODULO (classe definita come modulo) una cosa del tipo

Public Conn As New ClassConnessione
Public Generale As New ClassGenerali

Pensando di poter richiamare questi oggetti sempre e ovunque... e poi chiuderli alla chiusura della pagina master

Però mi da l'errore seguente

"**** Riferimento a un oggetto non impostato su un'istanza di oggetto ****"

Cosa sbaglio ? non si può fare quello che chiedo ? Perchè per un po' ha funzionato....

alx_81 Profilo | Guru

>Salve a tutti...
Ciao!

>Pensando di poter richiamare questi oggetti sempre e ovunque...
>e poi chiuderli alla chiusura della pagina master
>Però mi da l'errore seguente
>
>"**** Riferimento a un oggetto non impostato su un'istanza di oggetto ****"
>
>Cosa sbaglio ? non si può fare quello che chiedo ? Perchè per
>un po' ha funzionato....
Chiedo scusa ma così è impossibile capire cosa potrebbe essere. Devi provare a postare la routine che va in errore, la riga di codice ecc..
altrimenti brancoliamo nel buio

Alx81 =)

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

ravalon Profilo | Expert

Allora le due classi avete capito che esistono e cosa fanno

nella LOAD della master page ho richiamato questo codice

***********************************************
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
'richiamo le due connessione da subito
Conn.RichiamaConnGeneraliMySQL()
conn.RichiamaConnCatalogoMySQL()
End Sub
***********************************************

Vanno in errore....

Ecco cosa fa quella routine

***********************************************
Public Sub RichiamaConnGeneraliMySQL()
'passa i dati di connessione al DB
Call ConnessioneDB("localhost", "root", "xxxx", "Generali")
End Sub
***********************************************

In sostanza passa i dati per la connessione al DB...
Ecco cosa fa ConnessioneDB

***********************************************
Public Sub ConnessioneDB(ByVal strServer As String, ByVal strUser As String, ByVal strPsw As String, ByVal strDBName As String)

connectionError = False
connectionErrMsg = ""

'in base al nome del DB passato apro ConnettiGenerali o ConnettiCatalogo, i due oggetti odbcConnection esistenti.
If strDBName = "Generali" Then
If ConnettiGenerale.State = ConnectionState.Open Then Exit Sub
Dim strConn As String = ""
'VIA ODBC
Try
strConn = ConfigurationManager.ConnectionStrings("ConnMySQL").ToString
strConn = strConn & ";server=" & strServer & ";uid=" & strUser & ";pwd=" & strPsw & ";database=" & CStr(strDBName)
ConnettiGenerale.ConnectionString = strConn
ConnettiGenerale.Open()
Catch ex As Exception
'se c'è un errore metto i valori dentro alle proprietà cosi da
'poterle restituire dentro al codice...
connectionError = True
connectionErrMsg = "Errore in fase di connessione al Database MySQL; " & vbCrLf & vbCrLf & ex.Message & vbCrLf & vbCrLf & "DB richiamato:" & strDBName
MsgBox(connectionErrMsg)
End Try
ElseIf strDBName = "Catalogo" Then
If ConnettiCatalogo.State = ConnectionState.Open Then Exit Sub
Dim strConn As String = ""
'VIA ODBC

Try
strConn = ConfigurationManager.ConnectionStrings("ConnMySQL").ToString
strConn = strConn & ";server=" & strServer & ";uid=" & strUser & ";pwd=" & strPsw & ";database=" & CStr(strDBName)
ConnettiCatalogo.ConnectionString = strConn
ConnettiCatalogo.Open()
Catch ex As Exception
'se c'è un errore metto i valori dentro alle proprietà cosi da
'poterle restituire dentro al codice...
connectionError = True
connectionErrMsg = "Errore in fase di connessione al Database MySQL; " & vbCrLf & vbCrLf & ex.Message & vbCrLf & vbCrLf & "DB richiamato:" & strDBName
MsgBox(connectionErrMsg)
End Try

End If

End Sub
***********************************************

Però non sono le routine ad andare in errore....infatti se ogni volta dichiaro

Dim Conn as new ClassConnessione

poi non ci sono problemi

Se invece lo dichiaro una volta sola in un MODULO

Allora mi da quell'errore...

alx_81 Profilo | Guru

>Allora le due classi avete capito che esistono e cosa fanno
>
>Però non sono le routine ad andare in errore....infatti se ogni
>volta dichiaro
>
>Dim Conn as new ClassConnessione
>
>poi non ci sono problemi
>
>Se invece lo dichiaro una volta sola in un MODULO
>
>Allora mi da quell'errore...
Come ti torno a ripetere, dovresti fare debug per bene e vedere quale riga va effettivamente in errore.
Alx81 =)

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

ravalon Profilo | Expert

Puoi dirmi allora se teoricamente è possibile fare come avevo fatto, e cioè instanziare un oggetto connessione in un modulo, associarlo ad una classe e utilizzarlo poi da ovunque ?

alx_81 Profilo | Guru

>Puoi dirmi allora se teoricamente è possibile fare come avevo
>fatto, e cioè instanziare un oggetto connessione in un modulo,
>associarlo ad una classe e utilizzarlo poi da ovunque ?
Allora, di solito non uso molto variabili di modulo. Però, se le uso, non le istanzio direttamente nella dichiarazione, ma utilizzo dei metodi che li gestiscano. Ad esempio faccio un metodo OpenConnection, che fa la new degli oggetti ed apre le connessioni. E per tutta la durata della chiamata della pagina ho la connessione aperta (sul web ricorda che alla fine della chiamata della pagina devi chiudere tutto). Comunque preferisco la soluzione di aprire e chiudere la connessione solo quando mi serve. Se un metodo non la usa non apro la connessione.

Alx81 =)

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

ravalon Profilo | Expert

Io ho una classe connessione che effettua connessione e estrazione dati...

Avevo usato il modulo per aprire la connessione ad inizio pagina (dato che tutte estraggono dati) e chiuderla alla fine, quindi 2 sole operazioni x questo...

Altrimenti mi tocca fare che ogni volta che devo usare una funzione che estrae dati devo istanziare qualcosa del tipo

Dim Conn as new ClassConnessione
Connessione.metodo etc.etc..

Nella classe connessione c'è un controllo e se la connessione è già aperta salto il resto della procedura ma è noioso ogni volta dichiarare l'oggetto da usare....

alx_81 Profilo | Guru

Ho capito la tua esigenza. E ho capito perchè lo fai.
Mi hai chiesto se era possibile, io ti dico che non le uso quasi mai, ma se le uso non le istanzio a livello di metodo chiamando altri metodi ad hoc.
Che sia possibile direi di sì, ma l'unico modo per capire come mai va in errore è un debug approfondito. Di più non posso fare, mi dispiace.

Alx81 =)

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

ravalon Profilo | Expert

MA se faccio cosi come nel modo attuale, cioè

Nel Load della MasterPage richiamo la connessione e la apro
Nell'Unload della MasterPage la chiudo

Via via che mi serve usare l'oggetto connessione instanzio un oggetto e faccio un controllo...nel caso si fosse chiusa la connessione (non si sa mai) la riapro altrimenti uso quella aperta...

è sbagliato ?
E' corretto tecnicamente ?

alx_81 Profilo | Guru

>E' corretto tecnicamente ?
Ritengo che le connessioni debbano essere aperte il minor tempo possibile, quindi apro e chiudo solo all'occorrenza, per evitare di lasciarle appese. Per quello si preferisce di solito aprire e chiudere solo quando serve, anche se a tuo avviso è più scomodo (per me è una using - VB).

Alx81 =)

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

ravalon Profilo | Expert

Se volessi chiudere le connessioni al termine del caricamente della pagina (cosi che stanno aperte solo il tempo utile come dici tu, dove devo mettere la chiususa, nell'UNLOAD no vero ? dove allora )

alx_81 Profilo | Guru

>Se volessi chiudere le connessioni al termine del caricamente
>della pagina (cosi che stanno aperte solo il tempo utile come
>dici tu, dove devo mettere la chiususa, nell'UNLOAD no vero ?
>dove allora )
Di solito faccio un insieme di classi che mi definiscono la logica di business ed un elenco di classe che "lanciano" i comandi. Poi da web imposto il riferimento al business, che a sua volta si riferisce alle classi che eseguono il colloquio a db. Quest'ultimo livello (che chiamo livello "data"), apre le connessioni, esegue il comando (tipicamente una stored procedure di sql server) e poi la chiude subito. Sia quando non ho resultset di output sia quando mi servono set di dati in uscita. Nell'ultimo caso utilizzo ado.net in modalità disconnessa. Per farti capire meglio, ti illustro la gerarchia:

WEB (solo riferimenti alle classi "business" e chiamate) |-- Business (riferimenti alle classi "data") |-- Data (esecuzione effettiva dei comandi)

Nell'ultimo livello apro la connessione, creo i vari comandi e li eseguo, poi disconnetto.
Spero possa esserti di aiuto

Alx81 =)

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

ravalon Profilo | Expert

Non ho capito bene mi ci vorrebbe un esempio, ma comunque sia ho capito che chiudi subito gli oggetti data...

Io in realtà tengo aperto per la durata del caricamento della pagina solo la connessione al DB, non DataReader o altro, quelli li uso e li chiudo quanto prima.

Grazie comunque di tutti i tuoi suggerimenti.

alx_81 Profilo | Guru

>Non ho capito bene mi ci vorrebbe un esempio, ma comunque sia
>ho capito che chiudi subito gli oggetti data...
Sì, i chiudo subito. Comunque è semplice, dal web lanci un ipotetico metodo getdata() il quale al suo interno istanzia una classe business e lancia un metodo getdata() il quale a sua volta lancia il metodo getdata() della classe data. è tutto in cascata, solo che l'apertura e la chiusura sono solo a livello dell'ultimo metodo, il più profondo.

>Grazie comunque di tutti i tuoi suggerimenti.
Figurati. Ciao!

Alx81 =)

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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5