i trying update 2 different sql tables in same loop using parameterized queries in delphi xe8. want wrap whole thing in transaction, if in loop fails, neither table gets updated.
i don't know i'm doing, appreciate help.
the code below simplified version of i'm trying achieve, , best guess how go it. i'm not sure of @ all, particularly use of 2 datasets connected 'sql connection' component.
sql_transaction.transactionid :=1; sql_transaction.isolationlevel:=xilreadcommitted; sql_connection.begintransaction; try { create connections } sql_dataset1 :=tsqldataset.create(nil); sql_dataset1.sqlconnection:=sql_connection; sql_dataset2 :=tsqldataset.create(nil); sql_dataset2.sqlconnection:=sql_connection; { create queries } sql_dataset1.commandtype:=ctquery; sql_dataset1.commandtext:={ parameterized query updating table } sql_dataset2.commandtype:=ctquery; sql_dataset2.commandtext:={ parameterized query updating table b } { populate parameters , execute } i:=0 whatever begin sql_dataset1.parambyname('table field 1').asstring:='value'; sql_dataset1.execsql; sql_dataset2.parambyname('table b field 1').asstring:='value'; sql_dataset2.execsql; end; sql_connection.commit(sql_transaction); except sql_connection.rollback(sql_transaction); end; i using delphi xe8, , database can either sql server or sqlite.
the logic of transaction handling correct (except missing exception re-raise mentioned @whosrdaddy). wrong missing try..finally blocks dataset instances. except should stop using tsqlconnection deprecated methods using ttransactindesc record (always check compiler warnings when you're building app.). , can switch tsqlquery component. try instead:
var i: integer; query1: tsqlquery; query2: tsqlquery; connection: tsqlconnection; transaction: tdbxtransaction; begin ... query1 := tsqlquery.create(nil); try query1.sqlconnection := connection; query1.sql.text := '...'; query2 := tsqlquery.create(nil); try query2.sqlconnection := connection; query2.sql.text := '...'; transaction := connection.begintransaction; try // fill params here , execute commands := 0 42 begin query1.execsql; query2.execsql; end; // commit if went right connection.commitfreeandnil(transaction); except // rollback @ failure, , re-raise exception connection.rollbackfreeandnil(transaction); raise; end; query2.free; end; query1.free; end; end;
Comments
Post a Comment