Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Timeout expired ADO+SQLs con Execute

VB6 SP5, ADO 2.5, SQL Server 7.0 SP3
Il comando:
Connessione.Execute "DELETE FROM TABELLA"
Mi genera un errore -
2147217871
 (80040E31) Timeout Expired
La tabella era molto popolata. Rilanciando ha dato l'errore un'altra volta
e, al terzo tentativo, ha eseguito regolarmente. Se non ricordo male lo
stesso problema si ha anche eseguendo il comando da Enterpise Manager.
Cancella un tot di righe, va in timeout, si ripete a oltranza sino alla
cancellazione completa.
Su quale parametro (suppongo di SQL Server, visto che non è un timeout di
connessione) posso agire?
Sull'option "query wait" (di cui BOL dice "Changes to this option are NOT
reccomended")? Grazie.

molto strano, veramente, non mi č mai successo....
alcune domande: quanti campi ha la tabella? e quanti record?
se ha 6.000.000 di record č un discorso, ma se ne ha solo 25.000, č un
altro......
c'č qualche indice sulla tabella in questione?
io, forse, farei una bella sp sul server e la lancerei da vb, cosě da
migliorare anche in generale il traffico di rete.......
good coding!!!
--
Igor Damiani
ig...@igordamiani.it
http://www.igordamiani.it
ICQ : 11847262

 connessione) posso agire?
Ci dev'essere qualcosa nell'oggetto Command, ma da parte di ADO, non di
Sql-Server.
Sql-Server, di suo, non ti manda mai in timeout finchè lo spid è vivo.
Piuttosto, è l'EM o il Query Analyzer che ha un timeout, ma comunque
configurabile.
Ciao
Alberto

 configurabile.
Sì, immagino, prima mi sono espresso male: (vado a memoria) Da EM si apre
una tabella (tutte le righe), si selezionano tutte e si eliminano. Se sono
molte, lui ne cancella un tot, segnala il timeout e mostra le rimaste.
Quando l'ho fatto ho dovuto ripetere, ogni volta per le righe rimaste
(sempre meno), a oltranza per poter cancellare tutto.

 molte, lui ne cancella un tot, segnala il timeout e mostra le rimaste.
A parte quando ci sono poche righe, di solito uso il Q.A. per queste cose,
per cui non mi era mai successo.
Ciao
Alberto

 o meno, ecc...
Ho capito, ma non vorrei, ora, sconvolgere il tutto (non ho tempo,
maledizione!).
Pensi che impostando la proprietà .CommandTimeout dell'oggetto Connessione
(non dell'oggetto Command) questa venga considerata anche per un'istruzione
del tipo "Connessione.Execute "eccetera"?

 del tipo "Connessione.Execute "eccetera"?
Mai usato il Connessione.Execute, ma credo di sì.
Io creo un oggetto Command e uno Recordset all'inizio, li attacco alla
Connessione e poi uso sempre quelli (al limite creo nuovi recordset sulla
stessa connessione, se mi servono).
Ciao
Alberto

 del tipo "Connessione.Execute "eccetera"?
CommandTimeout = 0. In questo modo disattivi il timeout su qualunque query
(che quindi non possono essere interrotte: se si incricca non ne esci più).
Ti consiglio anche di impostare un valore alto (30-60) a ConnectionTimeout
perché questo genere di problema (che a me è capitato) dipende generalmente
da una cattiva connessione di rete, da un eccesso di traffico o dal fatto
che la cpu del server è impegnata altrove.
Una curiosità: nella tabella sono presenti campi image o [n]varchar
piuttosto grandi?
--
rumplestiltskin

 del tipo "Connessione.Execute "eccetera"?
Dalla guida su ADO:
Utilizzare la proprietà CommandTimeout su un oggetto Connection o Command
per consentire l'annullamento di una chiamata del metodo Execute, in seguito
a ritardi provocati dal traffico di rete o da un sovraccarico del server. Se
il comando non viene eseguito entro l'intervallo di tempo impostato nella
proprietà CommandTimeout, si verificherà un errore che provocherà
l'annullamento del comando. Se la proprietà viene impostata su zero, ADO
attenderà il completamento dell'operazione per un intervallo di tempo
indeterminato. Assicurarsi che il provider e l'origine dati su cui viene
scritto il codice supportino la funzionalità CommandTimeout.
L'impostazione CommandTimeout su un oggetto Connection non ha effetto
sull'impostazione CommandTimeout di un oggetto Command della stessa
Connection, ovvero la proprietà CommandTimeout dell'oggetto Command non
eredita il valore dell'impostazione CommandTimeout dell'oggetto Connection.
La proprietà CommandTimeout di un oggetto Connection rimane di
lettura/scrittura dopo aver aperto Connection.
Ciao, Alessandro

 piuttosto grandi?
Image no, campi Memo (in SQL Server/ADO mi pare che il tipo sia Text) sì,
anche se nel caso specifico erano tutti assolutamente vuoti.

 eredita il valore dell'impostazione CommandTimeout dell'oggetto
Connection.
Mi sta benissimo.

 anche se nel caso specifico erano tutti assolutamente vuoti.
Non vuol dire. Se usi un db SQL-Server 7- č possibile che si verifichino
problemi di vario genere con questi campi (con la 6 mi ricordo che venivano
fuori db di gb contro un costo reale di centinaia di mb). E' comunque un
problema risolto da 2000.
--
rumplestilskin

 parte, il settaggio di default č bassino (30" se non erro).
Bene. Grazie anche a te.
Riporto, per completezza, due link:
Questo, se non ho letto male, parla di un problema ... al contrario
http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q195489&
Attenzione a questo (bug corretto dalla 2.6)
Si veda l'esempio finale, identico (a parte il numero 0=senza timeout) alla
situazione che vorrei applicare e piů volte citata.
http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q175264&

 ha scritto nel messaggio
news:UPup9.15579$%M1.3...@twister2.libero.it...
Per curiosità: hai poi guardato se Truncate può fare al caso tuo?
Io lo uso sempre, per questo tipo di delete, e mi sembra molto performante.
Sarei curioso di scoprire casistiche in cui non è applicabile...
Ciao
Alberto

 Sarei curioso di scoprire casistiche in cui non è applicabile...
Oddio, io l'ho provata e non mi ha dato problemi. Albe, non farmi paura,
dai... ;-)