[Lazarus] SQLTransaction: Operation cannot be performed on an active transaction

Eric Kom erickom at metropolitancollege.co.za
Thu Jun 6 13:05:24 CEST 2013


On 04/06/2013 17:14, Antonio Fortuny wrote:
> Le 04/06/2013 16:54, Eric Kom a écrit :
>> On 04/06/2013 10:19, Antonio Fortuny wrote:
>>>
>> Thanks, I did changed to Commit and then caNone before it solved the 
>> error, another error message pop up saying Access Violation. Anyway, 
>> the problem was solved.
>>
>> The above code its giving me a problem; the  SQLQuery  do not changed 
>> according to the condition for exemple if the first condition 
>> matched, the second condition is still going to use the matching from 
>> the first and vice versa.
>>
>>          else if  (cbbList.Items[cbbList.ItemIndex] = lisList1) then 
>> begin
>>               DataModuleConn.SQLTransaction1.Active:=True;
> Use DataModuleConn.SQLTransaction1.StartTransaction instead, it is 
> more readable ans standard
> Also, if you commit or rollback the transaction most of the DataSet 
> based components close their datasets as well. This means that the 
> original transaction must be InTransaction for the grid to display the 
> collected data. The transaction can be shared by all DataSet 
> descendants though.
>> DataModuleConn.SQLQuery1.SQL.Text:='SELECT year, country, gender FROM 
>> reiser WHERE country = ''Dutch Republic''';
>> DBGrid1.DataSource.DataSet:=DataModuleConn.SQLQuery1;
>>               DBGrid1.DataSource:=DataModuleConn.Datasource;
>>               DBGrid1.DataSource.DataSet.Active:=True;
>>               //DataModuleConn.SQLTransaction1.Commit;
>>               DataModuleConn.SQLTransaction1.CommitRetaining;
>>          end
>>          else if  (cbbList.Items[cbbList.ItemIndex] = lisList1) then 
>> begin
>>               DataModuleConn.SQLTransaction1.Active:=True;
>>               DataModuleConn.SQLQuery1.SQL.Text:='SELECT year, 
>> country, gender FROM reiser WHERE country = ''Holland''';
>> DBGrid1.DataSource.DataSet:=DataModuleConn.SQLQuery1;
>>               DBGrid1.DataSource:=DataModuleConn.Datasource;
>>               DBGrid1.DataSource.DataSet.Active:=True;
>>               //DataModuleConn.SQLTransaction1.Commit;
>>               DataModuleConn.SQLTransaction1.CommitRetaining;
>>          end;
>>
>>   I have tried DataModuleConn.SQLTransaction1.Rollback also, still 
>> the same.
>>>
>>> Antonio.
>>>
>>>
>>> -- 
>>> _______________________________________________
>>> Lazarus mailing list
>>> Lazarus at lists.lazarus.freepascal.org
>>> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
>>>
>>
>>
>
Hi all,

I tried reviewed the code and commented the try...except statement for 
more debug:

procedure TfrmMainWindow.bitBtn1Click(Sender: TObject);
begin
//try
      DataModuleConn.openConnection;
      DataModuleConn.MySQL55Conn.Transaction   := 
DataModuleConn.SQLTransaction;
      //DataModuleConn.MySQL55Conn.Transaction.Active:=False;
DataModuleConn.SQLTransaction.DataBase:=DataModuleConn.MySQL55Conn;
      DataModuleConn.SQLQuery.DataBase:=DataModuleConn.MySQL55Conn;
DataModuleConn.SQLQuery.Transaction:=DataModuleConn.SQLTransaction;
      DataModuleConn.SQLQuery.Active:=False;
      DataModuleConn.SQLQuery.SQL.Text:='';
      DataModuleConn.Datasource.DataSet:=DataModuleConn.SQLQuery;
      DataModuleConn.Datasource.DataSet.Active:=False;
      //DBGrid1.DataSource.DataSet.Active:=False;
      DBGrid1.DataSource:=DataModuleConn.Datasource;
      DBNavigator.DataSource:=DataModuleConn.Datasource;

      if  DataModuleConn.MySQL55Conn.Connected=True then begin
          frmMainWindow.memReports.Append(msgOpeningDB);
          frmMainWindow.memReports.Append(msgDBReady);
      end;

      if  (cbbList1.Items[cbbList1.ItemIndex] = 'ALL') then begin
           DataModuleConn.SQLQuery.SQL.Text:='SELECT gender, year, 
country FROM reiser';
      end

      else if  (cbbList1.Items[cbbList1.ItemIndex] = lisCountry1) then begin
           DataModuleConn.SQLQuery.SQL.Text:='SELECT gender, year, 
country FROM reiser WHERE country = ''Dutch Republic''';
      end
      else //(cbbList1.Items[cbbList1.ItemIndex] = lisCountry3)
      begin
         DataModuleConn.SQLQuery.SQL.Text:='SELECT gender, year, country 
FROM reiser WHERE country = ''Holland''';
      end;

      //DataModuleConn.SQLTransaction.StartTransaction;
      DataModuleConn.SQLQuery.Close;
      DataModuleConn.Datasource.DataSet.Active:=True;
      DataModuleConn.SQLQuery.Open;

   //except
   //   frmMainWindow.memReports.Append(ErrConnectionFailed);
   //end;
end;

The first trigged for the procedure bitBtn1Click1 works fine, the 
second  trigged give up, with the above error:

Operation cannot be performed on an active dataset.

Press OK to ignore and risk data corruption.
Press Cancel to kill the program.

I tried to close and open the Dataset on my procedure bitBtn1Click1.

May you please assist me?

>
>
> -- 
> _______________________________________________
> Lazarus mailing list
> Lazarus at lists.lazarus.freepascal.org
> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
>


-- 
Kind Regards

Eric Kom

System Administrator & Programmer - Metropolitan College
  _________________________________________
/ You are scrupulously honest, frank, and \
| straightforward. Therefore you have few |
\ friends.                                /
  -----------------------------------------
    \
     \
         .--.
        |o_o |
        |:_/ |
       //   \ \
      (| Kom | )
     /'\_   _/`\
     \___)=(___/

2 Hennie Van Till, White River, 1240
Tel: 013 750 2255 | Fax: 013 750 0105 | Cell: 078 879 1334
erickom at kom.za.net | erickom at metropolitancollege.co.za
www.kom.za.net | www.kom.za.org | www.erickom.co.za

Key fingerprint: 513E E91A C243 3020 8735 09BB 2DBC 5AD7 A9DA 1EF5





More information about the Lazarus mailing list