Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Datareader aperto

  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2005
    Messaggi
    139

    Datareader aperto

    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

  2. #2
    Non e' bello dichiarare e soprattutto istanziare un oggetto connection globale per l'intera pagina. Se proprio vuoi lasciare un oggetto connection visibile all'intera pagina, limitati a dichiararlo e non anche a istanziarlo. Nel page_load lo istanzi e nel page_prerender lo chiudi. Altrimenti, dichiara istanzia usa e chiudi una connection ogni qualvolta ti serve e nel punto (procedura) in cui ti serve.
    Per il resto, mi sembra che il codice cosi com'e' scritto sia anche vulnerabile ad attacchi di sqlinjection. Fossi in te, non prenderei un valore dalla querystring per metterlo in una query sql senza neanche controllarlo. Se proprio non riesci a fare a meno della querystring piuttosto utilizza un parametro che almeno limita la possibilita' di sqlinjection.
    Saluti a tutti
    Riccardo

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2005
    Messaggi
    139
    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
    Ho anche provato a sostituire alla conn direttamente la stringa di connessione.... nulla da fare
    Ma come posso fare?

  4. #4
    codice:
    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            'Inserire qui il codice utente necessario per inizializzare la pagina 
            If Not Page.IsPostBack Then
                Dim conn As OleDbConnection
                Try
                    Dim cmd As OleDbCommand
                    Dim dr As OleDbDataReader
                    conn = New OleDbConnection("tuaconnectionstring")
                    cmd = conn.CreateCommand
                    cmd.CommandText = "SELECT * FROM TUATABELLA"
                    conn.Open()
                    dr = cmd.ExecuteReader
                    While dr.Read
                        If Not IsDBNull(dr(0)) Then Response.Write(CStr(dr(0)))
                        If Not IsDBNull(dr(1)) Then Response.Write(CStr(dr(1)))
                    End While
                    dr.Close()
                Finally
                    conn.Close()
                End Try
            End If
        End Sub
    Saluti a tutti
    Riccardo

  5. #5
    Utente di HTML.it L'avatar di cassano
    Registrato dal
    Aug 2004
    Messaggi
    3,002
    dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)

    io starei attento qui

    CommandBehavior.CloseConnection = Durante l'esecuzione del comando, l'oggetto Connection associato viene chiuso alla chiusura dell'oggetto DataReader associato

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.