SqlClient.DataReader blocca UPDATE su tabella

mercoledì 14 novembre 2007 - 13.21

aspnet.it Profilo | Newbie

Ciao a tutti,
ho aperto due connessioni ad un Sql2000.
Sulla prima connessione ho aperto un datareader interrogando più tabelle.
Sulla seconda connessione provo a lanciare un command UPDATE su una tabella che fa parte di quelle interrogate dal DataReader.
Il commando di UPDATE va in TIMEOUT. Se chiudo il datareader allora il comando di UPDATE funziona.

Mi sembra strano.
mi confermate questa cosa?
grazie
ciao
aspNet.it

alx_81 Profilo | Guru

>Ciao a tutti,
Ciao!

>ho aperto due connessioni ad un Sql2000.
>Sulla prima connessione ho aperto un datareader interrogando
>più tabelle.
>Sulla seconda connessione provo a lanciare un command UPDATE
>su una tabella che fa parte di quelle interrogate dal DataReader.
>Il commando di UPDATE va in TIMEOUT. Se chiudo il datareader
>allora il comando di UPDATE funziona.
>
>Mi sembra strano.
No, è del tutto normale, perchè il datareader rimane connesso sull'oggetto/sugli oggetti.. quindi l'update non riesce ad accedere alla risorsa e va in timeout..
Utilizza un datatable e non avrai problemi di sorta..
>mi confermate questa cosa?
roger

>grazie
di nulla!
Alx81 =)

http://blogs.dotnethell.it/suxstellino

aspnet.it Profilo | Newbie

Ciao!
grazie per la risposta.
Il problema è che devo leggere un milioncino di record.
Quindi preferirei usare un dataReader anziché scaricare il tutto.
pensi ci sia un'altra possibilità?
grazie
ciao
aspNet.it

alx_81 Profilo | Guru

>Ciao!
>grazie per la risposta.
>Il problema è che devo leggere un milioncino di record.
>Quindi preferirei usare un dataReader anziché scaricare il tutto.
>pensi ci sia un'altra possibilità?
sei in asp.net o in una winapp?
Perchè nel primo caso, leggere un milione di record è una specie di suicidio , mentre nel secondo, puoi usare il tuo oggetto disconnesso, aspettando il tempo necessario.. Altra alternativa con sql 2005, se li hai, sono i ssis.. dipende sempre quello che devi fare, quando e in che termini..
Alx81 =)

http://blogs.dotnethell.it/suxstellino

aspnet.it Profilo | Newbie

Ciao,
è una winApplication
grazie!
cià

alx_81 Profilo | Guru

>Ciao,
Ciao

>è una winApplication
allora vai di datatable e fai attendere quanto serve.. per ogni riga di datatable, lanci il comando di aggiornamento..
Sicuro che però non si possa risolvere il tutto con una semplice update su sql?
Magari con la update from riesci a risolvere il problema senza fare per forza dei cicli..


Alx81 =)

http://blogs.dotnethell.it/suxstellino

aspnet.it Profilo | Newbie

Ti ringrazio per i consigli.
Faccio con il datatable anche se la soluzione mi fa un po' schifino :)
Mi sembra una gran bella limitazione.
cmq sia purtroppo non è possibile farlo con un semplice comando e nemeno con una storedProcedure poiché devono essere cercati ed elaborati che sono su altri database eterogenei.
grazie!
ciao
aspNet.it

clint Profilo | Newbie

Ho un problema ancora più banale con il datareader e SQL 2000.
la mia applicazione winform esegue una query tramite un sqlcommand e in sequenza degli update su alcuni dei record estratti, sempre tramite un sqlcommand.

In SQL2005 ho dovuto chiudere il datareader prima di eseguire l'ExececuteNonQuery() altrimenti mi usciva l'errore 'al comando è già associato un datareader aperto, che deve essere chiuso'.
Risolto questo inghippo, un giorno approfondirò, ho provato il tutto sotto SQL2000 e mi sono 'ribaltato' quando lo stesso errore mi è uscito all'altezza del comando Reader.read()

TmpQrySelect.Transaction = TmpQrySelect.Connection.BeginTransaction();
TmpQryUpdate.Transaction = TmpQrySelect.Transaction;
MessageBox.Show("Step 1");
QryReader = TmpQrySelect.ExecuteReader();
MessageBox.Show("Step 2");

try
{
Processed = 0;
dataGridView1.Rows.Clear();
MessageBox.Show("Step 3");
while (QryReader.Read())
{
MessageBox.Show("Step 4");
....

dopo la visualizzazione del messaggio 'step 3', esce il messaggio di errore già citato sopra.
se può servire sto provando il tutto su un macchina virtuale VMWare 6.0 con XP pro e Sql2000
Di procedure che lavorano con SQL 2000 ne ho scritte quintali con altri linguaggi, ma su Visual Studio sono alle prime esperienze.

Oltre a provare con un DataTable, avete modo di farmi capire il perchè del problema?
Grazie mille




alx_81 Profilo | Guru

>dopo la visualizzazione del messaggio 'step 3', esce il messaggio
>di errore già citato sopra.
>se può servire sto provando il tutto su un macchina virtuale
>VMWare 6.0 con XP pro e Sql2000
>Di procedure che lavorano con SQL 2000 ne ho scritte quintali
>con altri linguaggi, ma su Visual Studio sono alle prime esperienze.
>
>Oltre a provare con un DataTable, avete modo di farmi capire
>il perchè del problema?
potresti postare tutto il codice lato server? perchè qui non vedo nulla a prima vista


Alx81 =)

http://blogs.dotnethell.it/suxstellino

clint Profilo | Newbie

Ti allego tutta la procedura di elaborazione nella sua forma più semplificata (che però continua a non funzionare in SQL2000).
Lato server non ci sono altre procedure, trigger o altro...
Come puoi notare, per farlo funzionare sotto sql2005, ho utilizzato temporaneamentre una '.aialata' perchè dovevo procedere con il resto dello sviluppo.
Probabilmente utilizzando un datatable supero anche questo ripiego, ma mi sfugge davvero il problema sul datareader.

Adesso mi sto scornando con SQL2000...probabilmente è solo una questione di entrare nella mentalità .net...


Grazie ancora per la disponibilità
Ciao
Clint


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

ps: adesso controllo anche che la versione di sql2000 sia aggiornata all'ultimo SP

alx_81 Profilo | Guru

>Ti allego tutta la procedura di elaborazione nella sua forma
>più semplificata (che però continua a non funzionare in SQL2000).
>Lato server non ci sono altre procedure, trigger o altro...
>Come puoi notare, per farlo funzionare sotto sql2005, ho utilizzato
>temporaneamentre una '.aialata' perchè dovevo procedere con il
>resto dello sviluppo.
>Probabilmente utilizzando un datatable supero anche questo ripiego,
>ma mi sfugge davvero il problema sul datareader.
Guarda, mi dispiace ma a me funziona ..
Più che altro, ti consiglio di non concatenare il nome del db nelle query e tantomeno di usare la stringa direttamente così, visto che hai SQL Server 2000 o 2005, fatti delle stored procedure.
Ma per il funzionamento, cambiando le query per il mio contesto, il giro funziona..
Non so proprio che dire.. mi spiace..
hai qualche impostazione particolare a livello di transaction isolation level del db?


Alx81 =)

http://blogs.dotnethell.it/suxstellino

clint Profilo | Newbie

Ti ringrazio molto per le prove che hai fatto.
Adesso sto scaricando l'SP4 (avevo appena installato SQL 2000 sulla macchina virtuale utilizzando il cd originale).
In caso di esito negativo scarterò il datareader e inserirò un datatable.
Le stored procedure le avevo scartate inizialmente perchè devo lavorare con diversi DB legati ad alcuni parametri....
Ciao

alx_81 Profilo | Guru

>Ti ringrazio molto per le prove che hai fatto.
>Adesso sto scaricando l'SP4 (avevo appena installato SQL 2000
>sulla macchina virtuale utilizzando il cd originale).
>In caso di esito negativo scarterò il datareader e inserirò
>un datatable.
>Le stored procedure le avevo scartate inizialmente perchè devo
>lavorare con diversi DB legati ad alcuni parametri....
appunto, passa il db alla stored, ma non SQL nel codice
>Ciao
>

Alx81 =)

http://blogs.dotnethell.it/suxstellino

clint Profilo | Newbie

per la cronaca l'SP4 non ha risolto.
Ora ho modificato il codice per utilizzare un tableadapter.
Il sql2005 funziona. adesso provo in sql2000
se il cerchio si chiude faccio anche qualche prova con le SP
Grazie ancora
Ciao
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5