Newsgroup: it.comp.lang.visual-basic
Titolo: [VB.NET] datareader

Ciao,
sto da poco passando 
vb.net
 da vb6 � mi trovo ad affrontare un problema che 
sembrerebbe un grosso limite del .net ma spero di sbagliarmi.
Devo visualizzare in una listview dei dati da una query a un db my sql. Li 
leggo in un oggetto datareader e li visualizzo con un loop nella listview. E 
tutto funziona correttamente.
Ora per� devo leggere dei dati con una seconda query all'interno del loop, e 
qu� mi da errore perch� non mi permette di associare un secondo datareader 
alla stessa connessione. Codice:
        Dim LI As ListViewItem
        Dim SQL As String, SQL2 As String
        SQL = "select ....."
        Dim cmd As New MySqlCommand(SQL, Conn)
        Dim rs As MySqlDataReader = cmd.ExecuteReader
        lstappinst.Items.Clear()
        Do While rs.Read
            LI = lstAppInst.Items.Add(rs!campo1)
            lstAppInst.Items(lstAppInst.Items.Count - 1).Tag = "S" & 
Format(rs!codice, "0000")
            LI.SubItems.Add(rs!campo2 & "")
            SQL2 = "select ...."
            Dim cmd2 As New MySqlCommand(SQL2, Conn)
            Dim rs2 As MySqlDataReader = cmd2.ExecuteReader
            LI.SubItems.Add(rs2!camposec)
            rs2.Close()
        Loop
        rs.Close()
Soluzioni? Magari non usare i datareader?
bye,
max 

 Soluzioni? Magari non usare i datareader?
Non so se possa essere una buona pratica o meno ma ... aprire una 
seconda connessione per utilizzare il nuovo datareader?
ciao
Mauro

Innuendo <a@b.c> wrote in news:4cc6a431$0$45267
$
4faf...@reader4.news.tin.it
:

imo non e' una buona idea.
usa un dataset; se arrivi da vb6 ci vuole un attimo di piu' a capire il 
meccanismo, ma una volta che inizi difficilmente torno indietro.
il datareader *sembra* piu' facile (e forse inizialmente lo e') perche' 
ti ricorda il caldo e confortevole recordset, ma prova a dare un'occhiata 
a dataadapter & datatable.
dbConn = New SqlClient.SqlConnection(DB_CONN_STRING)
dAdapter = New SqlClient.SqlDataAdapter("laTuaSelect", dbConn)
tabella = New Data.DataTable("nome")
dAdapter.Fill(tabella)
dAdapter.Dispose()
a questo punto hai il risultato della tua select in 'tabella', che puoi 
bindare direttamente all'oggetto che preferisci senza i problemi di 
datareader aperti o penzolanti.
-- 
Paolo opg
BE AWARE that this post uses a fake reply-to address
to contact me write to:
janickg ( at ) hotmail ( dot ) com
--

 imo non e' una buona idea.
in effetti sarebbe un ottima idea, anche in VB6 dietro le quinte veniva 
aperta una seconda connessione in maniera trasparente allo sviluppatore 
(il male). Del resto non ï¿œ possibile avere piï¿œ di un cursore forward 
only per connessione.
.m
-- 
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCTS
http://mvp.support.microsoft.com
blog @ 
http://milestone.topics.it
whynot [ at ] topics [ dot ] it

salve Massimo,

puoi vedere magari l'utilizzo dei MARS, 
http://www.aspitalia.com/articoli/sqlserver2005/mars.aspx
, che consentono 
quello che in effetti stai cercando di fare..
saluti
-- 
Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz
DbaMgr2k ver 0.21.1 - DbaMgr ver 0.65.1 and further SQL Tools
http://www.hotelsole.com
 - 
http://www.hotelsolericcione.de
--------- remove DMO to reply 

 di datareader aperti o penzolanti.
quello che non mi piace � il binding, preferisco riempire il listview 
"manualmente", ho bisogno di fare controlli interattivi su ogni riga mentre 
la inserisco. Suppongo che anche con i dataset sia possibile estrapolare il 
singolo campo nel singolo record della tabella, giusto?
bye,
max 


probabilmente � una pratica errata ma io nei miei software ho l'abitudine di
aprire una connessione (come oggetto pubblico) all'avvio del prg e
mantenerla aperta fino alla sua chiusura. Dici che � sconsigliabile?
bye,
max

 mantenerla aperta fino alla sua chiusura. Dici che ï¿œ sconsigliabile?
Si, ï¿œ la stessa cosa che facevo io e me l'hanno caldamente sconsigliata :-)
Molto meglio aprire e chiudere la connessione ad ogni query e lasciare 
che si occupi di tutto il resto il garbage collector e il connection 
pooling.
ciao
Mauro

 max


 singolo campo nel singolo record della tabella, giusto?
puoi farlo anche con il binding.



Non mi risulta che il ListView supporti il databinding... è cambiato
in VS2010?

 in VS2010?
no, ListView nello specifico no, almeno per Windows Forms.


 
nel caso specifico, imo non e' una gran trovata.
usare due connessioni per fare quello per cui ne basta una, mi pare uno 
spreco di risorse.
fatto salvo il fatto che comunque io preferirei usare un dataset.


 spreco di risorse.
il problema ï¿œ che non se ne ï¿œ mai potuta usare una sola.


 
dbConn = New SqlClient.SqlConnection(DB_CONN_STRING)
dAdapter = New SqlClient.SqlDataAdapter("laTuaSelect1", dbConn)
tabella1 = New Data.DataTable("nome1")
dAdapter.Fill(tabella1)
dAdapter.Dispose()
dAdapter = New SqlClient.SqlDataAdapter("laTuaSelect2", dbConn)
tabella2 = New Data.DataTable("nome2")
dAdapter.Fill(tabella2)
dAdapter.Dispose()
dbConn.close
ho due datatable contenenti il risultato di due diverse interrogazioni
eseguite aprendo una sola connessione. 
o mi son perso qualcosa?


 o mi son perso qualcosa?
Quoto la domanda iniziale:
"Ora perï¿œ devo leggere dei dati con una seconda query all'interno del 
loop, e quï¿œ mi da errore perchï¿œ non mi permette di associare un secondo 
datareader alla stessa connessione."
apre una connessione e avvia un DataReader (cursore) mentre scorre il 
data reader vuole eseguire una seconda query (quindi un secondo 
cursore) con la stessa connessione impegnata dal cursore precedente, 
non si puï¿œ fare.
Il tuo esempio non fa una piega ma non ï¿œ la stessa cosa, ï¿œ ovviamente 
una soluzione al problema.


 saluti
Sta usando mySQL...
Ciao, Vincenzo