Fórum TRANSAÇÃO ANINHADA #392377

14/12/2010

0


olá amigos
abaixo um modelo de transação colhido na net (funcional)

---
procedure TForm1.Button1Click(Sender: TObject);
var
  Transacao: TTransactionDesc;
begin
  Try
    Transacao.TransactionID  := 1;
    Transacao.IsolationLevel := xilREPEATABLEREAD;

    // sqlconnection
    sc_teste.StartTransaction(Transacao);

    // sqldataset
    sds_teste_1.Close;
    sds_teste_1.CommandType := ctQuery;
    sds_teste_1.CommandText := 'insert into teste_1 (CAMPO_1, CAMPO_2) values(:P_CAMPO_1, :P_CAMPO_2)';
    sds_teste_1.ParamByName('P_CAMPO_1').AsString := Edit1.Text;
    sds_teste_1.ParamByName('P_CAMPO_2').AsString := Edit2.Text;
    sds_teste_1.ExecSQL;

    // sqlconnection
    sc_teste.Commit(Transacao);

  Except on Exc:Exception do
    Begin
      ShowMessage('Ocorreu um erro durante a inclusão: ' + Exc.Message);
      //sqlconnection
      sc_teste.RollBack(Transacao);
    End;
  End;
end;
---

minha questão é...
preciso fazer N inserts utilizando o sqldataset (sds_teste_1)...
tipo um laço com while ou for...

...
while ainda_tem_que_inserir do
begin
 sds_teste_1.CommandText := 'insert into teste_1 (CAMPO_1, CAMPO_2) values(:P_CAMPO_1, :P_CAMPO_2)';
end;
...

e mais N inserts com outro sqldataset (sds_teste_2)...
também tipo um laço while ou for...

...
while ainda_tem_que_inserir do
begin
 sds_teste_2.CommandText := 'insert into teste_2 (CAMPO_3, CAMPO_4) values(:P_CAMPO_3, :P_CAMPO_4)';
end;
...

depois de feitos os inserts nas 2 tabelas...
vou efetuar o comit
e tendo ocorrido  qualquer erro durante as inserções 1 e 2
anulo todas as inserções com o sc_teste.rollback(Transacao);
(ou grava tudo certo... ou não grava nada).

não sei como aninhar estas sequencias de inserts dentro de 1 só transação.
tipo... como ficaria as linhas...

    // iniciar a primeira sequencia de inserções
    sds_teste_1.Close;
    sds_teste_1.CommandType := ctQuery;

    // aqui o laço das inserções em teste_1 ?
    // while... do.. begin...
    sds_teste_1.CommandText := 'insert into teste_1 (CAMPO_1, CAMPO_2) values(:P_CAMPO_1, :P_CAMPO_2)';
    // end...

    sds_teste_1.ParamByName('P_CAMPO_1').AsString := Edit1.Text;
    sds_teste_1.ParamByName('P_CAMPO_2').AsString := Edit2.Text;

    sds_teste_1.ExecSQL;

    // iniciar segunda sequencia de inserções
    sds_teste_2.Close;
    sds_teste_2.CommandType := ctQuery;

    // aqui o laço das inserções em teste_2 ?
    // while... do... begin
    sds_teste_2.CommandText := 'insert into teste_1 (CAMPO_1, CAMPO_2) values(:P_CAMPO_1, :P_CAMPO_2)';
    // end...

    sds_teste_2.ParamByName('P_CAMPO_1').AsString := Edit1.Text;
    sds_teste_2.ParamByName('P_CAMPO_2').AsString := Edit2.Text;

    sds_teste_2.ExecSQL;

...
qualquer erro... o rollback de tudo.

grato se puderem me ajudar.
Userba

Userba

Responder

Posts

14/12/2010

Leonardo Xavier

tente assim:


    // iniciar a primeira sequencia de inserções
    sds_teste_1.Close;

    sds_teste_1.CommandType := ctQuery;

   
// aqui o laço das inserções em teste_1 ?
    // while... do.. begin...
    sds_teste_1.CommandText := 'insert into teste_1 (CAMPO_1, CAMPO_2) values(:P_CAMPO_1, :P_CAMPO_2)';
   
// end...

    sds_teste_1.ParamByName('P_CAMPO_1').AsString := Edit1.Text;

    sds_teste_1.ParamByName('P_CAMPO_2').AsString := Edit2.Text;



    // iniciar segunda sequencia de inserções
    sds_teste_2.Close;


    sds_teste_2.CommandType := ctQuery;



   
// aqui o laço das inserções em teste_2 ?
    // while... do... begin

    sds_teste_2.CommandText := 'insert into teste_1 (CAMPO_1, CAMPO_2) values(:P_CAMPO_1, :P_CAMPO_2)';
    // end...

    sds_teste_2.ParamByName('P_CAMPO_1').AsString := Edit1.Text;


    sds_teste_2.ParamByName('P_CAMPO_2').AsString := Edit2.Text;


    sds_teste_1.ExecSQL;
    sds_teste_2.ExecSQL;

Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar