150 messaggi dal 02 ottobre 2003
Effettuo il seguente aggiornamento batch :

try
MyTrans = _myconnection.BeginTransaction()

MyCommand_1 = New SqlCommand(Cmd1, _myconnection())
MyCommand_1.Transaction = myTrans
MyCommand_1.ExecuteNonQuery()

MyCommand_2 = New SqlCommand(Cmd2, _myconnection())
MyCommand_2.Transaction = myTrans
MyCommand_2.ExecuteNonQuery()

MyCommand_3 = New SqlCommand(Cmd3, _myconnection())
MyCommand_3.Transaction = myTrans
MyCommand_3.ExecuteNonQuery()

Mytrans.Commit

catch e as Exception

Mytrans.Rollback()

end try

tuuto funziona ma l'aggiornamento è lentissimo. Vi chiedo è esatto il mio modo di procedere?
GRAZIE

Modificato da giusag76 il 25 novembre 2003 10.12 -
150 messaggi dal 02 ottobre 2003
aiutatemi perchè non capisco se sbaglio..!
66 messaggi dal 29 aprile 2001
www.xepient.com
Ciao giusag,
il codice corrisponde ai metodi consigliati da microsoft, ma la tua performance migliorerebbe del doppio se usassi una unica SP che ti gestisca la transazione:

Create Procedure test
@parametro1 int....
as
begin transaction
insert1....
insert2....
ecc.....
if @@error <> 0
rollback transaction
else
commit transaction
GO

le cose migliorano anche dipendendo dal provider che usi: odbc o oledb.
prova anche a fare un SET NONCOUNT ON nella tua sp, questo eviterá che sia creato un log di ciascuna transazione, ed in teoria aumenta la velocitá.

ciao.
150 messaggi dal 02 ottobre 2003
Il problema è che non so a priori quante e quali sono le query di aggiornamento da eseguire, quindi non sò come creare la SP in tale caso.
Volevo inoltre chiedere come mai c'è questo rallentamento che è tanto; non a caso a volte mi dice che il tempo disponibile è scaduto prima del completamento dell'operazione.
66 messaggi dal 29 aprile 2001
www.xepient.com
hmmm le cose si complicano.

una soluzione che ti permetta usare lo stesso metodo (SP) é quella di passare l'intero testo delle query come parametro alla sp, e poi utilizzare il metodo exec(@parametro) . Se questo metodo funziona, sicuramente guadagnerai qualcosa in performance ma non te lo posso assicurare.


es:
1. dal tuo codice prepara i vari query:
dim sqlQuery as string = "insert1...insert2...update3 ecc..."

2. passa la variabile sqlQuery a una SP
3. crea la SP che accetti un parametro @sqlQuery
4. esegui il comando exec:
begin transaction
EXEC(@sqlQuery)
if @@error <> 0
rollback transaction
else
commit transaction
GO



In quanto al perché, non sono riushito a trovare una spiegazione convincente. Sembra dipendere dal numero di operazioni input/output che bisogna svolgere per assicurare una transazione fatta dal cliente.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.