Newsgroup: it.comp.lang.visual-basic
Titolo: problema datareader e connesisone

Ciao,
oggi mi sono imbattuto in un problema che non mi aspettavo.
Quasi tutte le mie classi che devono leggere dati da database, utilizzano un 
oggetto per l'accesso al db, e delegano a quest'ultimo tutte le operazioni 
da fare.
Queste classi hanno un metodo privato (una funzione) chiamato quando si va 
ad impostare dall'esterno la proprieta' ID dell'oggetto; cioe', se qualcuno 
passa all'oggetto l'ID, l'oggetto *sa* che esiste e deve andare a popolare 
tutte le sue variabili con i dati provenienti dal db.
Per fare questo utilizza un DataReader che e' cio' che una funzione 
dell'oggetto che gestisce il database restituisce in base ad una query.
Sono stato controrto eh!
Faccio un esempietto, considerate che m_objDB e' l'oggetto che si prende 
carico della connessione al DB e di effettuare le operazioni, strSQL e' la 
stringa di select e il secondo argomento della funzione e' un valore 
booleano che dice alla funzione che deve recuperare il DataReader se si 
aspetta una sola riga o meno.
Dim DR As SqlClient.SqlDataReader = m_objDB.String2DataReader (strSQL,True)
Tenete conto che la funzione String2DataReader controlla se la connessione 
al db e' aperta e, se come ci si aspetta e' chiusa, la apre.
A questo punto ho un DataReader, che come comportamento ha *sempre* quello 
di chiudere la connessione quando viene chiuso lui stesso.
Posso quindi estrarre tutti i valori che mi servono dal DB, e poi chiudere 
il DataReadre, e questo fa in modo che anche la connessione venga chiusa.
In definitiva, la sequenza e', *sempre*...
Apro la connessione (cioe' l'oggetto SQLConnection),  creo un nuovo 
SqlCommand passandogli la connessione e la stringa sql di query, eseguo il 
metodo ExecuteReader del comando e ne ottengo il DataReader, il 
CommandBehavior passato come argomento al metodo ExecuteReader e' sempre 
CloseConnection e, a volte anche SingleRow.
Utilizzo il mio DataReader, poi lo chiudo.
Eccoci al problema.... (finalmente, direte)
Se mi creo una lista di ID di oggetti che mi servono, poi faccio un loop su 
questa lista, creo gli oggetti e passo loro l'ID, capita in maniera 
abbastanza casuale che a volte, quando vado ad aprire la connessione per 
avere un DataReader di ritorno dalla funzione String2Datareader, la 
connessione stessa risulta aperta e l'oggetto command assegnatole, gia' 
occupato con un oggetto DataReader.
Provo a fare un altro esempio
Dim I as Integer
For I = 1 To 100
   dim obj as new clsMyObjecy
  obj.ID = I ' (assegnando questa proprieta', l'oggetto obj e' in grado di 
tirarsi su i propri dati con il giochino del DataReader
Next I
Succede che ogni tanto, la connessione che utilizzo nel metodo 
String2Datareader di m_objDB, risulta impegnata.
Dato pero' che, a quanto mi risulta, Ado.Net lavora in modalita' sincrona, a 
meno di utilizzare delegati asincroni, mi aspetterei che il programma 
venisse "congelato" finche' tutte le chiamate non vengano portate a termine 
(immagino il metodo Close del Datareader).
chi mi sa spiegare cosa succede?
Eventuali soluzioni?
Grazie a tutti, specialmente per la pazienza servita per leggere fin qui!

Mi rispondo da solo....
il probelma era che, in realta', oltre a leggere le informazioni da me 
cercate, una classe andava anche a registrare dei dati sul db, quindi 
lanciava un metodo ExecuteNonQuery con un Insert.
Tolto questo, risolto il problema.
Resta pero' da capire perche' il metodo ExecuteNonQuery non ri comporta 
(almeno all'apparenza) come un metodo sincrono.
Ciao a tutti... Maurizio