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 :
- Você preenche a
DataTableque será usado para a atualização. - Exclui a linha com
Code = 1101(por exemplo) diretamente do banco de dados, ou seja, você não usa oDataTableaqui. Isso está emulando outro usuário excluindo a linha comCode = 1101de outro aplicativo. Ou alguma outra parte do seu código excluindo a linha comCode = 1101. - Seleciona a linha com
Code = 1101daDataTable, isso é apenas para mostrar que ele ainda está lá, mesmo que você o tenha excluído do próprio banco de dados. - Edita a
Quantitycoluna na linha comCode = 1101naDataTable. Isso precisa ser feito, caso contrário, a chamada para Update ignorará esta linha ao atualizar. - 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 .