Pergunta

O que é a melhor abordagem para sincronização de um DataSet com dados em um banco de dados? Aqui estão os parâmetros:

  • Não podemos simplesmente recarregar os dados porque está vinculado a um controle de interface do usuário que um usuário pode ter configurado (é uma grade de árvore que eles podem expandir / recolher)
  • Não podemos usar um changeflag (como um UpdatedTimeStamp) no banco de dados porque as mudanças nem sempre fluir através da aplicação (por exemplo, um DBA pode atualizar um campo com uma instrução SQL)
  • Não podemos usar um disparador de atualização no banco de dados porque é um sistema multi-user
  • Nós estamos usando ADO.NET DataSets
  • Vários campos podem mudar de uma determinada linha

Eu olhei capacidade de mesclagem do DataSet, mas isso não parece manter a noção de uma coluna "ID". Eu olhei capacidade DiffGram mas a questão aqui é aqueles parecem ser gerada a partir de mudanças dentro do mesmo conjunto de dados ao invés de mudanças que ocorreram em alguma fonte de dados externa.

Fui correndo a partir desta solução por um tempo, mas a abordagem que eu sei iria trabalhar (com um monte de ineffeciency) é construir um DataSet separado e em seguida, iterar todas as linhas de aplicar as alterações, campo a campo, para o DataSet em qual ele está ligado.

Alguém já teve um cenário semelhante? O que você fez para resolver o problema? Mesmo se você não ter executado em um problema semelhante, qualquer recomendação para uma solução é apreciado.

Graças

Foi útil?

Solução

DataSet.Merge funciona bem para este se você tem uma chave primária definida para cada DataTable; o DataSet irá disparar eventos alterados para quaisquer controles de ligação de dados GUI

Se a tabela é pequena você pode simplesmente voltar a ler todas as linhas e mesclar periodicamente, caso contrário, limitar o conjunto para ser lido com um timestamp é uma boa idéia - apenas dizer os DBAs para seguir as regras e atualizar o timestamp; -)

outra opção - que é um pouco de trabalho - é manter uma fila-fila alterado (timestamp, linha ID) usando um disparador ou procedimento armazenado, e base as consultas de atualização fora do timestamp na fila; este será mais eficiente se a tabela base tem um monte de linhas na mesma, permitindo que você (através de uma junção interna no registro fila) para puxar apenas as linhas alteradas desde a última vez enquete.

Outras dicas

Eu acho que seria mais fácil para armazenar uma lista dos nós que o usuário tenha expandido (supondo que você pode identificar cada um), em seguida, re-carregar os dados e re-ligamento-lo para exibição em árvore, em seguida, expanda todos os nós anteriormente expandida.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top