Problema DataReader chiuso

di il
22 risposte

Problema DataReader chiuso

Ciao a tutti, sono 2 giorni che non capisco il motivo per il quale mi viene restituito l'errore:
"Tentativo non valido di chiamare Read con reader chiuso"

il codice che uso è il seguente e funziona ovviamente sempre anche negli altri Form del progetto
myConnection.ConnectionString = connString
myConnection.Open()
Dim trova As String
trova = "SELECT *From Magazzino WHERE Fornitore=@Fornitore OR Marca=@Marca OR Barcode=@Barcode OR Articolo=@Articolo OR Matricola=@Matricola OR Categoria=@Categoria OR Ubicazione=@Ubicazione"
Dim cmd As OleDbCommand = New OleDbCommand(trova, myConnection)
cmd.Parameters.AddWithValue("@Fornitore", TBtrova.Text)
cmd.Parameters.AddWithValue("@Marca", TBtrova.Text)
cmd.Parameters.AddWithValue("@Barcode", TBtrova.Text)
cmd.Parameters.AddWithValue("@Articolo", TBtrova.Text)
cmd.Parameters.AddWithValue("@Matricola", TBtrova.Text)
cmd.Parameters.AddWithValue("@Categoria", TBtrova.Text)
cmd.Parameters.AddWithValue("@Ubicazione", TBtrova.Text)
cmd.ExecuteNonQuery()
Lettore = cmd.ExecuteReader()
DGVmagazzino.Rows.Clear()
While Lettore.Read()
DGVmagazzino.Rows.Add(Lettore("ID"), Lettore("Fornitore"), Lettore("Marca"), Lettore("Barcode"), Lettore("Articolo"), Lettore("Matricola"), Lettore("Categoria"), Lettore("Ubicazione"), Lettore("Acquisto"), Lettore("Vendita"), Lettore("Giacenza"), Lettore("Minimo"), Lettore("Unita"), Lettore("Operatore"), Lettore("Data"))
myConnection.Close()
End While
myConnection.Close()
me lo segnala sulla riga While Lettore.read() e per adesso solo se è presente il dato nel Database perchè non ho inserito ancora l'eccezione, ma non è un problema adesso.

ovviamente ho dichiarato il Dim Lettore As OleDbDataReader

perchè diamine mi da questo errore secondo voi?

Grazie

22 Risposte

  • Re: Problema DataReader chiuso

    orione1976 ha scritto:


    cmd.ExecuteNonQuery()
    Lettore = cmd.ExecuteReader()
    Perché invochi sia ExecuteNonQuery() sia ExecuteReader()?
    O l'uno o l'altro.
  • Re: Problema DataReader chiuso

    Si scusa è stato solo un errore di trascrizione, nel codice non c'è era uno dei tentativi ma ovviamente non è presente nel codice in uso. Non capisco perchè da quell'erroee che in un form parallelo stesso codice va ovviamente bene
  • Re: Problema DataReader chiuso

    Non solo, perchè scrivi "SELECT *From" con lo star attaccato a "From"? e perchè chiudi due volte la connessione? inoltre perchè non chiudi il Reader?
  • Re: Problema DataReader chiuso

    L'asterisco attaccato non mi ha mai dato problemi ma giustamente lo stacco, chiudo la connessione 2 volte perchè devo generare le eccezioni del caso quindi invece di metterlo a fine codice siccome userò poi un Exit Sub magari mi rimane aperto...
  • Re: Problema DataReader chiuso

    Il DataReader [Lettore] dove è dichiarato?
    Per queste operazioni andrebbe usata come da esempio sulla documentazione ufficiale.

    orione1976 ha scritto:


    chiudo la connessione 2 volte perchè devo generare le eccezioni del caso
    Questo non l'ho capito...

    Ma a mio parere, è più agevole dichiarare un TableAdapter, Fillare una tabella e associarla alla DGV, piuttosto che ciclare un DataReader...
  • Re: Problema DataReader chiuso

    Il Lettore è dichiarato già:
    Dim Lettore As OleDbDataReader
    l'ho scritto anche prima ma da sempre lo stesso problema non capisco, ho dovuto riscrivere il codice anche se non ha senso perchè anche se funziona, qualcuno storcerà il muso perchè so bene che non è ottimale impostarlo così
     myConnection.ConnectionString = connString
                myConnection.Open()
                Dim trova As String
                trova = "SELECT * FROM Magazzino WHERE Fornitore= '" & TBtrova.Text & "' OR Marca= '" & TBtrova.Text & "' OR Barcode= '" & TBtrova.Text & "' OR Articolo= '" & TBtrova.Text & "' OR Matricola= '" & TBtrova.Text & "' OR Categoria= '" & TBtrova.Text & "' OR Ubicazione= '" & TBtrova.Text & "'"
                Dim cmd As OleDbCommand = New OleDbCommand(trova, myConnection)
                Lettore = cmd.ExecuteReader()
                DGVmagazzino.Rows.Clear()
                While Lettore.Read()
                    DGVmagazzino.Rows.Add(Lettore("ID"), Lettore("Fornitore"), Lettore("Marca"), Lettore("Barcode"), Lettore("Articolo"), Lettore("Matricola"), Lettore("Categoria"), Lettore("Ubicazione"), Lettore("Acquisto"), Lettore("Vendita"), Lettore("Giacenza"), Lettore("Minimo"), Lettore("Unita"), Lettore("Operatore"), Lettore("Data"))
                End While
                Lettore.Close()
                myConnection.Close()
    però adesso funziona ed è molto strano, lo lascio così però mi piacerebbe capire perchè non funziona nell'altro modo visto che è una sequenza che uso spesso... mah
  • Re: Problema DataReader chiuso

    orione1976 ha scritto: ?29 apr 2021, 12:23
    chiudo la connessione 2 volte perchè devo generare le eccezioni del caso
    Questo non l'ho capito...
    Questo era semplicemente perchè sto ancora in fase di sviluppo con le idee e visto che devo inserire altre cose nel mezzo, preferisco chiudere piu volte che lasciare aperto, ma sarebbe tornato chiaro a codice ultimato, dove poi avrei analizzato se fossero superflui o meno... è solo un approccio che uso per evitare errori sciocchi che mi distraggono, nulla di particolare...
  • Re: Problema DataReader chiuso

    orione1976 ha scritto:


    Si scusa è stato solo un errore di trascrizione, nel codice non c'è era uno dei tentativi ma ovviamente non è presente nel codice in uso.
    Il codice non va trascritto, ma va copiato/incollato, altrimenti non mi metto neanche a guardarlo, perché potremmo stare giorni ad analizzarlo per poi scoprire che la vera causa dell'errore è stata omessa dalla parte di codice pubblicato.

    Riporta il codice vero e proprio così com'è, ed evidenzia la riga precisa in cui ti viene segnalato l'errore.
    Qualsiasi altra informazione di contorno, se utile, è sempre ben accetta.

    Ciao!
  • Re: Problema DataReader chiuso

    Ciao Scusa ho fatto ovviamente copia\incolla intendevo dire che nel riportare il codice ho solo dimenticato di levare quella parte che ho usato per l'ultimo test, l'errore lo da nel Lettore.Read()

    non so che dire è strano, ho controllato se al suo interno ci fossero problemi ma è tutto ok, ho provato con un dato non presente nel database e non genera errore, se il file è presente fa questa cosa. Ho risolto riscrivendo in quel modo che molti odiano, ma il codice usato è esattamente quello, non calcolare executenonquery e al massimo * da staccare come suggerito da Toky ma non genera errore.
  • Re: Problema DataReader chiuso

    orione1976 ha scritto:


    ...Ho risolto riscrivendo in quel modo che molti odiano...
    1) non è questione di odiare i parametri... Se esistono un motivo c'è e ti invito ad approfondire il discorso delle Sql Injection.

    2) Tu oltre ad aver tolto i parametri, hai anche tolto la chiamata a [myConnection.Close] da dentro il ciclo. Prova a rimetterla senza aggiungere i parametri e vedi se non ti ridà errore.
  • Re: Problema DataReader chiuso

    L'uso dei parametri è fondamentale. Non è questione di gusti.

    Riscrivi il codice con i parametri e forniscilo dopo averlo controllato nuovamente. E non presentare linee di codice che in effetti non utilizzi.
  • Re: Problema DataReader chiuso

    Ok, ho avuto 5 minuti ed ho riscritto il codice come in teoria faccio sempre, l'unica cosa è che ho tolto il connection.close dal cicli while e funziona.... quindi ho capito che lo chiudevo nel posto sbagliato.... Grazie per la precisazione e sto leggendo come consigliato... anche se so perchè scrivo quelle righe... grazie per la pazienza
     myConnection.ConnectionString = connString
            myConnection.Open()
            Dim trova As String
            trova = "SELECT * From Magazzino WHERE Fornitore=@Fornitore OR Marca=@Marca OR Barcode=@Barcode OR Articolo=@Articolo OR Matricola=@Matricola OR Categoria=@Categoria OR Ubicazione=@Ubicazione"
            Dim cmd As OleDbCommand = New OleDbCommand(trova, myConnection)
            cmd.Parameters.AddWithValue("@Fornitore", TBtrova.Text)
            cmd.Parameters.AddWithValue("@Marca", TBtrova.Text)
            cmd.Parameters.AddWithValue("@Barcode", TBtrova.Text)
            cmd.Parameters.AddWithValue("@Articolo", TBtrova.Text)
            cmd.Parameters.AddWithValue("@Matricola", TBtrova.Text)
            cmd.Parameters.AddWithValue("@Categoria", TBtrova.Text)
            cmd.Parameters.AddWithValue("@Ubicazione", TBtrova.Text)
            Lettore = cmd.ExecuteReader()
            DGVmagazzino.Rows.Clear()
            While Lettore.Read()
                DGVmagazzino.Rows.Add(Lettore("ID"), Lettore("Fornitore"), Lettore("Marca"), Lettore("Barcode"), Lettore("Articolo"), Lettore("Matricola"), Lettore("Categoria"), Lettore("Ubicazione"), Lettore("Acquisto"), Lettore("Vendita"), Lettore("Giacenza"), Lettore("Minimo"), Lettore("Unita"), Lettore("Operatore"), Lettore("Data"))
            End While
            myConnection.Close()
            Lettore.Close()
  • Re: Problema DataReader chiuso

    orione1976 ha scritto:


    
            myConnection.Close()
            Lettore.Close()
    
    Generalmente, prima si chiude il DataReader, poi la Connection, preferibilmente usando un costrutto Using o in alternativa un Try Finally per garantire che ciò avvenga, prima di abbandonare quella parte di codice, lasciando al Garbage Collector la sola eliminazione degli oggetti creati.

    Ciao!
  • Re: Problema DataReader chiuso

    Perfetto grazie, ho fatto giustamente come segnalavi...

    unica cosa, sapreste spiegarmi perchè se nel campo di ricerca aggiungo ID poi mi da errore se non trova il dato?
    cioè se cerco ciao e ciao è presente lo carica, se ciao non c'è mi da errore "Tipi di dati non corrispondenti nell'espressione di criterio"

    mentre se tolgo dalla ricerca il campo ID, se trova il dato lo carica altrimenti no....
     myConnection.ConnectionString = connString
                myConnection.Open()
                Dim trova As String
                trova = "SELECT * FROM Clienti WHERE ID=@ID OR Cognome=@Cognome OR Cf=@Cf OR Societa=@Societa OR Piva=@Piva"
                Dim cmd As OleDbCommand = New OleDbCommand(trova, myConnection)
                cmd.Parameters.AddWithValue("@ID", TBtrova.Text)
                cmd.Parameters.AddWithValue("@Cognome", TBtrova.Text)
                cmd.Parameters.AddWithValue("@Societa", TBtrova.Text)
                cmd.Parameters.AddWithValue("@Cf", TBtrova.Text)
                cmd.Parameters.AddWithValue("@Piva", TBtrova.Text)
                readuser = cmd.ExecuteReader()
                Me.DGVtrova.Rows.Clear()
                While readuser.Read()
                    DGVtrova.Rows.Add(readuser("ID"), readuser("Cognome"), readuser("Nome"), readuser("Societa"), readuser("Via"), readuser("Città"), readuser("Provincia"), readuser("Cf"), readuser("Piva"), readuser("Telefono"), readuser("Cellulare"), readuser("Email"), readuser("Note"))
                End While
                readuser.Close()
                myConnection.Close()
    scusate ma in rete non trovo soluzioni... (o cerco male?)
Devi accedere o registrarti per scrivere nel forum
22 risposte