PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Exceção DBConcurrency ocorreu durante a atualização usando o adaptador de dados


Isso ocorre porque DataAdapter usa Optimistic Concurrency por padrão. Isso significa que, se você estiver tentando atualizar uma linha que não existe mais no banco de dados ou foi alterada, a atualização do DataAdapter falhará com a exceção acima.

Cenários possíveis :
  • Entre você selecionando os dados no cliente e enviando a atualização, outro usuário está excluindo ou atualizando esta linha de seu aplicativo.
  • Pode ser que você esteja excluindo os dados de outro lugar em seu aplicativo.

Por exemplo :
  1. Você preenche a DataTable que será usado para a atualização.
  2. Exclui a linha com Code = 1101 (por exemplo) diretamente do banco de dados, ou seja, você não usa o DataTable aqui. Isso está emulando outro usuário excluindo a linha com Code = 1101 de outro aplicativo. Ou alguma outra parte do seu código excluindo a linha com Code = 1101 .
  3. Seleciona a linha com Code = 1101 da DataTable , isso é apenas para mostrar que ele ainda está lá, mesmo que você o tenha excluído do próprio banco de dados.
  4. Edita a Quantity coluna na linha com Code = 1101 na DataTable . Isso precisa ser feito, caso contrário, a chamada para Update ignorará esta linha ao atualizar.
  5. Executa a atualização, isso lançará a exceção, pois você está tentando atualizar uma linha que (não mais) existe no banco de dados.

Se você deseja implementar Last Writer Wins , Adicione o seguinte código:
cb.ConflictOption = ConflictOption.OverwriteChanges;

Também há mais uma coisa possível:se você tiver Decimal /numeric como colunas no banco de dados, elas podem causar esse erro, mesmo que os dados pareçam iguais. Isso ocorre devido a um erro de arredondamento decimal.

Uma observação importante :Você deve sempre usar parameterized queries a propósito. Este tipo de concatenação de strings está aberta para SQL Injection .