Datareader aperto

venerdì 01 luglio 2005 - 15.05

temerario Profilo | Junior Member

Mi trovo ora con questo problema
Da una pagina che non fa assolutamente uso di datareader chiama questa dove il codice iniziale è:

Dim conn As MySqlConnection = CType(getStrConnection("conn"), MySqlConnection)

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim cmd As MySqlCommand
Dim dr As MySqlDataReader

If Not Page.IsPostBack Then
Session.Remove("dt")
If Request.QueryString("op") = "Edit" Then
Try
cmd = New MySqlCommand(String.Format(sqlSelectCliente, Request.QueryString("codice")), conn)
conn.Open()
dr = cmd.ExecuteReader()
If dr.Read() Then

Quando eseguo dr = cmd.ExecuteReader() mi scatta l'eccezione
there is already an open datareader associated with this connection which must be closed first.
Ma se nella pagina precedente non utilizzo nessun datareader come è possibile?
Come faccio a risolvere o verificare dove può stare qualche datareader aperto?

Ciao

Andy Profilo | Senior Member

Ciao..a livello di codice io verificherei che ogni volta che apri una Datareader con cmd.ExecuteReader, poi alla fine lo richiudi correttamente.

Se invece hai altre procedure intere che utilizzano datareader stai attento alle connessioni..ho notato che non usi una connessione locale per la tua procedura Load, ma crei una variabile Private..
non è detto che l'errore sia un datareader aperto, ma può anche essere che veda un altro datareader associato a quella connessione..

temerario Profilo | Junior Member

Dim conn As MySqlConnection = CType(getStrConnection("conn"), MySqlConnection)

è una dichiarazione che faccio in tutte le pagine ASPX in testa.
Oltreutto ho controllato che in tutti i datareader del mio progetto venga eseguito l'overload del executereader per fare in modo che venga chiusa sempre la connessione.

Se vuoi ti posso mandare il file in allegato e puoi vedere tu...

Andy Profilo | Senior Member

Hai ragione, il codice sembra a posto, chiudi ogni volta correttamente il Dr.

Prova a fare un controllo anche prima di eseguire il fatidico executereader, per vedere se effettivamente Dr è già aperto, o se puoi escludere questa causa..se non è aperto sicuramente devi controllare la connessione..

temerario Profilo | Junior Member

prima di eseguire

cmd = New MySqlCommand

Conn istanziato ma chiuso
cmd NOTHING
dr NOTHING

Appena la eseguo ho

Conn istanziato ma chiuso
cmd instanziato
dr NOTHING

Dopo aver eseguito conn.open ho

Conn aperta
cmd.ExecuteReader() con l'eccezione
dr.NOTHING





temerario Profilo | Junior Member

una cosa molta strana che ho notato è questa.
Mi sono creato una paginetta esterna al progetto ed ho eseguito le classi istruzione di connessione

Dim conn As MySqlConnection = CType(getStrConnection("conn"), MySqlConnection)
Dim cmd As New MySqlCommand
Dim dr As MySqlDataReader

If Not Page.IsPostBack Then
Try
cmd = New MySqlCommand("....", conn)
conn.Open()
dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)
If dr.Read() Then
dim prova as string = dr(0)
dim prova1 as string = dr(1)
dr.close()
Catch exc As MySqlException
....
Finally
If (Not (dr Is Nothing)) AndAlso (dr.IsClosed = False) Then
dr.Close()
End If
conn.Close()
End Try
end if

Se vado a impostare come espressione di controllo cmd.ExecuteReader mi scatta l'eccezione in fase di debug. Se eseguo senza debug... va bene.
All'interno del progetto invece l'eccezione scatta anche in esecuzione normale.
L'ecceziione è sempre la stessa:
Generata eccezione in fase di esecuzione:System.InvalidOperationException - Connection must be valid and open

Ma come posso fare?

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