Curso de ADO.NET e BDP - Parte VI

Acesso a dados no Delphi 8 for .NET

 

Parte VI – Transações com o BdpTransaction

Transações são importantes para garantir a integridade das atualizações enviadas ao banco de dados. Por exemplo, se você executar uma série de updates , e um deles falhar, talvez queira que toda a operação seja cancelada. Ou seja, usando transações, podemos garantir a atomicidade de uma série de operações no BD. Costumo fazer a analogia com uma transação bancária. Um saque em um caixa automático requer uma série de operações. Se em algum momento umas das operações falhar, toda a transação deve ser desfeita (caso contrário um valor pode ser debitado de sua conta de forma incorreta).

Existem muitas aplicações para o uso de transações. Uma vantagem é que o BDP já gerencia automaticamente transações quando usamos o BdpDataAdapter . Algumas vezes, no entanto, você pode querer controlar uma transação manualmente. Veremos como fazer isso na prática nesta sexta parte do curso, usando o BdpTransaction .

No BDP, o BdpTransaction é responsável por gerenciar transações com o banco de dados. Use o método BeginTransaction do BdpConnection para obter um objeto do tipo IDBTransaction . Os métodos Commit e RollBack do BdpTransaction são usados para efetivar ou não a transação. O nível de isolamento pode ser passado como parâmetro no BeginTransaction . Como você pode ver, há uma similaridade bastante grande com a nomenclatura usada no DataSnap / dbExpress / BDE . A forma de utilização também é idêntica, de forma que você não terá maiores dificuldades se já trabalha com acesso a dados no Delphi.

Criando a aplicação

Faremos agora um exemplo prático que demonstra a utilização do BdpTransaction . Inicie uma nova aplicação do tipo Windows Forms Application . Arraste para o designer a conexão Employee a partir do Data Explorer. Isso cria um BdpConnection Coloque um BdpCommand no formulário e aponte sua propriedade Connection para BdpConnection1 .

Coloque agora no formulário um Button , um Label e três TextBoxes . Configure a propriedade MultiLine de um dos TextBoxes para True (para que ele fique semelhante a um Memo da VCL). Esse TextBox exibirá a mensagem de erro gerada pelo BD.

Seu formulário deve estar semelhante ao mostrado a seguir:

 

 

O exemplo funcionará da seguinte forma: digitaremos dois comandos SQL nos TextBoxes , e executaremos ambos no contexto de uma única transação. Caso um deles falhe, damos um RollBack na transação e não efetivamos as atualizações, exibindo o erro no terceiro TextBox . Caso tudo funcione como esperado, efetivamos a transação chamando um Commit.

 

Executando comandos com transação

No evento Click do botão digite o seguinte:

 

procedure TWinForm.btExec_Click(sender: System.Object; e: System.EventArgs);

var

  Trans: IDbTransaction;

begin

  BdpConnection1.Open;

   try

     Trans := BdpConnection1.BeginTransaction;

       try

        BdpCommand1.CommandText := TextBox1.Text;

        BdpCommand1.ExecuteNonQuery;

        BdpCommand1.CommandText := TextBox2.Text;

        BdpCommand1.ExecuteNonQuery;

        Trans.Commit;

        Label1.Text := 'Commit - Transação encerrada com sucesso';

      except

        on E: Exception do

          begin

          Trans.Rollback;

          Label1.Text := 'RollBack - Alterações não efetivadas no BD';

          TextBox3.Text := E.Message;

          end;

     end;

  finally

       BdpConnection1.Close;

  end;

end;

 

Aqui usamos o método BeginTransaction do BdpConnection para iniciar uma transação.A seguir, usamos o componente BdpCommand para executar os comandos digitados, através da sua propriedade CommandText . O método ExecuteNonQuery , como já vimos anteriormente neste curso, é usado para executar comandos que não retornam um conjunto de dados, como Update, Delete ou Insert .

As operações são protegidas por um bloco Try Except , que nos dá a possibilidade de executar código de tratamento caso um erro ocorra (nesse caso damos um RollBack na transação). Um bloco Try Finally garante que, sob qualquer circunstância, a conexão seja sempre fechada após a operação.

Testando

Execute a aplicação e digite os comandos nos TextBoxes , como mostrado na figura a seguir:

 

 

O primeiro comando atualiza o campo CUSTOMER de todos os registros de tabela CUSTOMER para o valor “TESTE”. O segundo comando exclui o CUSTOMER que possui CUST_NO igual a “ 1015” . Observe que o segundo comando violará uma Foreign Key no servidor, já que existe uma referência a esse registro na tabela SALES. Nesse caso, a transação garantirá que o primeiro comando não seja efetivado (a tabela não é atualizada), desfazendo toda a operação:



Download

Você pode fazer download de todos os exemplos deste curso de acesso a dados no Delphi 8 com ADO.NET e BDP a partir do endereço http://cc.borland.com/cc/ccweb.exe/author?authorid=222668

 

Na próxima parte do curso conheceremos os serviços de MetaData disponibilizados pelo BDP. Um abraço e até lá!

Leia todos artigos da série