• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Zamits

Detectar alterações a uma tabela numa Base de Dados

10 mensagens neste tópico

Boas pessoal.

Eu estou a desenvolver uma aplicação em C# que comunica com um BD utilizando o SQL Server 2000.

O que eu pretendia saber é se existe alguma maneira de, a partir da minha aplicação em C#, que corre em ciclo infinito, saber se existiram alterações a uma tabela na base de dados.

Ou seja, eu pretendo que ao ser realizado algum insert ou update a um dos registos dessa tabela a minha apicação C# tenha conhecimento e detecte essa mesma alteração.

Qual a melhor forma de conseguir isto? É possível consegui-lo apenas a partir do programa em C#, ou tenho que criar algum procedimento em SQL que depois avisa a minha aplicação de que existiram mudanças?

Eu pensei nos triggers e já um utilizador mos indicou, mas quanto aos triggers tenho duas dúvidas:

- Primeiro, se criar um trigger externo à aplicação escrita em C#, como é que aviso essa mesma aplicação quando o trigger é disparado?

- Segundo, é possível criar triggers embebidos em código C#, para o SQL Server 2000? É que todos os exemplos que vejo na net, mostram realmente triggers em C#, mas utilizando o template do Visual Studio "SQLServerProject" e que apenas funciona com a versão 2005 do SQL Server, enquanto que eu estou a desenvolver utilizando a 2000.

Se alguém me pudesse ajudar agradecia.

Desde já obrigado, Zamits!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não me lembro de nenhuma forma de implementar um sistema de messaging em SQL Server 2000, sugiro uma sistema de pooling, ou seja, guardar os dados em outra tabela quando é disparado um trigger, tipo Audit_X.

Na aplicação em C# efectuar um sistema de pooling na tabela. Sugiro também algum campo na tabela Audit_X que indique que já foi efectuado pooling para a aplicação de forma a não estar sempre a retornar os mesmos dados. Ou então apagar da tabela sempre que se efectuar a leitura.

Se alguem sabe de uma forma de implementar tipo messaging gostaria de ouvir também.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Triggers embebidos numa aplicação... nunca ouvi falar em tal coisa.

Eu tambem criaria uma tabela auxiliar, não estou a ver é nenhuma forma de siinalização para alem de estar sempre a consultar essa tal tabela.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

boax...

Por .net Remoting...

aplicacoes cliente/servidor.

Todas os acessos a bd sao feitos pelo servidor, e sempre que a bd é alterada, o servidor retem essa informacao.

no entanto, para o cliente saber dessas alteracoes, tera de contactar o servidor de tempos a tempos... mas como tu dissestes que a tua aplicacao estava em ciclo infinito ......

Ja me faz lembrar o COBOL  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Qualquer aplicação de desktop está em ciclo infinito de forma a poder receber os sinais do utilizador. A chave do problema aqui é mesmo enviar um sinal da base de dados que possa ser apanhado pelo loop principal da aplicação.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

boax...

Sim ... mas existe uma diferenca entre uma aplicacao que esta a espera de algo... e outra que tenha um timer, por exemplo, que ela mesma provoca a accao...

Mais uma discussao filosofica com o pedrotuga :)

o .net remoting nao serve?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Há várias formas de o fazer, preferencialmente recorrendo a triggers (unicamente na BD).

Quando ocorre uma alteração, regista-se a mesma numa tabela de controlo que é consultada periodicamente.

Outra solução é, marcar cada registo com o timestamp da última actualização.

Sabendo a aplicação qual foi a última mudança que ocorreu, basta essa mudança contra o timestamp da última actualização na bd.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Parece-me a melhor solução M6.

Os triggers na BD não resolvem o problema.

A minha preferência pessoal vai para o camnpo de timestamp de ultima alteração na tabela, porque vai permitir a evolução para versionamento e outras solução de certa elegãncia.

Claro que se forem muitas tabelas, o hack da tabela de controlo pode resolver.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não deixa de ter que consultar periodicamente os valores, além disso terá de guardar os anteriores de forma a efectuar um comparativo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

DateTime.Now é bom.

E não me parece que haja falta de ciclos, afinal.. é um ciclo infinito  :ipool:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora