Work with Transaction

Discussion of open issues, suggestions and bugs regarding UniDAC (Universal Data Access Components) for Delphi, C++Builder, Lazarus (and FPC)
Post Reply
DarkProgger
Posts: 3
Joined: Tue 14 Feb 2012 18:58

Work with Transaction

Post by DarkProgger » Wed 15 Feb 2012 08:22

Hello. I have some problems with transaction.
Early I'm used FIB and I can do those thing

Code: Select all

Transaction.startTransaction.
DataSet.Appent;
DataSet.FieldByName('ID').AsString:='12345';
DataSet.Post;
DataSet.Edit;
///user something doing in Application
DataSet.FieldByName('Field1').AsString:='12345';
DataSet.FieldByName('Field2').AsString:='67890';
DataSet.FieldByName('Field3').AsString:='54321';
DataSet.Post;
If Save then
   DataSet.Commit
   else
   DataSet.Rollback;
But when I use UniDAC when I use DataSet.Post in Grid appear new record and this record appear in DataBase.
I don't understand how turn off AutoCommit without creating new class(examle i found here on forum, but IMHO it's wrong way).

AndreyZ

Post by AndreyZ » Wed 15 Feb 2012 12:05

Hello,

To solve the problem, you should use transactions of a dataset. Here is an example:

Code: Select all

UniQuery.Connection := UniConnection;
UniTransaction1.DefaultConnection := UniConnection;
UniTransaction2.DefaultConnection := UniConnection;
UniQuery.SQL.Text := 'select * from tablename';
UniQuery.Transaction := UniTransaction1; // transaction for data reading
UniQuery.UpdateTransaction := UniTransaction2; // transaction for data modifications
UniQuery.Open;
UniQuery.UpdateTransaction.StartTransaction;
UniQuery.Edit;
UniQuery.FieldByName('ID').AsString := '12345';
UniQuery.Post;
UniQuery.UpdateTransaction.Commit;

DarkProgger
Posts: 3
Joined: Tue 14 Feb 2012 18:58

Post by DarkProgger » Wed 15 Feb 2012 13:02

I don't understand why I'm couldn't use one Transaction?

AndreyZ

Post by AndreyZ » Wed 15 Feb 2012 14:44

InterBase and Firebird require an active transaction for any operation under data. When you open a dataset, one transaction is started to allow you reading data. You cannot use the StartTransaction method for an already started transaction. Therefore, if you want to start a new transaction for data modifying, you have to use another transaction.

Post Reply