TRANSAÇÃO ANINHADA
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
Curtidas 0
Respostas
Leonardo Xavier
14/12/2010
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;
GOSTEI 0