Datareader ADO.NET

venerdì 11 febbraio 2011 - 10.58

_jack_ Profilo | Junior Member

Ciao a tutti,
magari è una domanda banale ma....
Se faccio una query con le ADO.NET usando SQLCommand e SQLDataReader e, mentre ciclo sui risultati trovati, dovessi fare una seconda query mi dice che è già associato un DataReader e che prima devo chiuderlo.
Non c'è modo evitare questa eccezione?
So che dovrei associare ad ogni DataReader una connessione ma mi pare impensabile creare tante connessioni quanti sono questi casi all'interno del programma...

Grazie
Ciao

Jack

luka82 Profilo | Junior Member

>Non c'è modo evitare questa eccezione?
Devi solo cambiare approccio.
Prova a postare un ciclo che fai e vediamo come possiamo modificarlo. Ogni volta devi chiudere la connessione, il DataReader... è così!

Ciao.

_jack_ Profilo | Junior Member


>Devi solo cambiare approccio.
>Prova a postare un ciclo che fai e vediamo come possiamo modificarlo.
>Ogni volta devi chiudere la connessione, il DataReader... è così!
Ciao, io per semplificare molto ho detto un ciclo; in realtà cadevo nell'eccezione quando, da una form "contenitore", aprivo altre form che hanno dele funzioni di recupero dati nell'evento FORMLOAD.
Ad ogni modo il codice è questo:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


>Ciao.
Ciao e grazie

AntCiar Profilo | Expert

Ciao.

Quando usi il datareader è normale che non puoi fare altre letture sulla stessa connessione mentre è aperto un reader.

Per risolvere basta usare il DataAdapter e riempire un oggetto dataTable. Dopo scorri le righe di questo oggetto e ti prendi i valori nelle rispettive colonne. In questo modo puoi fare altre interrogazioni perchè il reader è attivo solo in fase di popolamento del datatable e dopo, quando scorri, il reader è già chiuso.

Utilizza il codice che segue caso mai mettendolo in una funzione pubblica che restituisce un dataTable in un modulo in modo che la puoi usare altrovesenza dover replicare il codice. PS: il codice l'ho scritto di pugno quindi può darsi che ci sia qualche errore di sintassi.

Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter()
da.SelectCommand = New OleDb.OleDbCommand()
da.SelectCommand.Connection = New OleDb.OleDbConnection("...........")
da.SelectCommand.CommandType = CommandType.Text
da.SelectCommand.CommandText = "SELECT ...... FROM ..... WHERE....."

Dim Tab As DataTable = New DataTable()
da.Fill(Tab)
da = Nothing
return Tab
Cristian Barca

_jack_ Profilo | Junior Member

Ciao,
per funzionare fnziona....mi lascia un po' perplesso l'utilizzo di così tanti oggetti....

Però posso usare questa opzione.

Grazie
Ciao

luka82 Profilo | Junior Member

Il messaggio di errore te lo da in qualsiasi situazione(ciclo, nel tuo caso apertura della form e più in generale, se esegui più query senza prima chiudere la connessione).
A quanto posso immaginare usi un DataReader a livello di applicazione, giusto?
Per ogni query devi:
aprire datareader e connessione -> eseguire la query -> chiudere datareader e connessione
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