Esse artigo faz parte da revista Clube Delphi edição 51. Clique aqui para ler todos os artigos desta edição



Atenção: por essa edição ser muito antiga não há arquivo PDF para download. Os artigos dessa edição estão disponíveis somente através do formato HTML. 

 

DataSetProvider Avançado

Armazene em log todas as alterações feitas no banco de dados

 

Neste artigo veremos como utilizar alguns recursos avançados do DataSetProvider e do ClientDataSet para fazer log de todas as atualizações enviadas ao banco de dados. A partir desses logs, você poderá, por exemplo, identificar e recuperar registros excluídos ou modificados de forma indevida por um usuário do sistema.

O que faremos basicamente será salvar todos os DataPackets de atualização (os chamados Deltas) em arquivos no disco, juntamente com informações sobre o usuário, data/hora, tabela atualizada etc. Essa abordagem é bastante flexível: você poderá adaptar a solução à qualquer aplicação (desde que faça uso de

ClientDataSets e DataSetProviders), independente do banco de dados que esteja utilizando.

 

Construindo a aplicação de exemplo

Crie uma nova aplicação no Delphi e adicione um DataModule ao projeto (chame-o de "DM"). Acredito que o leitor já está familiarizado com a criação de aplicações de banco de dados usando dbExpress, de forma que não entrarei em detalhes sobre a configuração dos componentes. Caso você nunca tenha feito uma conexão dbExpress, poderá ler um artigo introdutório que colocamos no portal do assinante (www.clubedelphi.com.br/portal).

Veja na Figura 1 os componentes utilizados e formulário principal da aplicação com os controles Data-Aware. Aqui estou acessando o banco de dados Employee.gdb dos demos do Interbase. O SQLQuery obtém dados da tabela Customer e tem a seguinte instrução SQL: "select CUST_NO,CU5TOMER,CITY from CUSTOMER”. Veja a seguir o código colocado no evento OnClick do botão Aplicar:

 

procedure TForrn1.Button1lClick(Sender: TObject);

begin

{Declare DBClient no uses}

(DataSource1.DataSet as

TClientDataSet).ApplyUpdates(O);

end:

 

Figura 1.Formulário principal da aplicação e DataModule

 

Antes de continuarmos o exemplo, é importante lembrar como funciona o tratamento de DataPackets feito pelo DataSetProvider.

 

DataSetProvider e DataPackets

Quando abrimos o ClientDataSet, internamente é chamado o método de interface AS-GetRecords (de IAppServer). O DataSetProvider recebe essa chamada e faz uma varredura no DataSet associado, montando um DataPacket Midas.

Esse "empacotamento" é feito, na verdade, por uma classe interna ao DataSetProvider, chamada TDataPacketWriter. Ela chama métodos de interface para se comunicar com a biblioteca Midas.dll, que é realmente quem faz a montagem do DataPacket (o código do "empacotamento" é um segredo que a Borland guarda à "sete chaves").

Esse DataPacket fica armazenado em cache pelo ClientDataSet, em sua propriedade Data (um OleVariant). Nesse momento, o DataSetProvider pode fechar o cursor aberto pelo DataSet, liberando recursos no servidor.

Todas as atualizações feitas no ClientDataSet, como inclusão, exclusão ou alteração de registros, são guardadas em uma segunda cache, chamada Delta, que é enviado de volta ao DataSetProvider quando o ApplyUpdates é chamado. ...

Quer ler esse conteúdo completo? Tenha acesso completo