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
DataTable
que 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 oDataTable
aqui. Isso está emulando outro usuário excluindo a linha comCode = 1101
de outro aplicativo. Ou alguma outra parte do seu código excluindo a linha comCode = 1101
. - Seleciona a linha com
Code = 1101
daDataTable
, isso é apenas para mostrar que ele ainda está lá, mesmo que você o tenha excluído do próprio banco de dados. - Edita a
Quantity
coluna na linha comCode = 1101
naDataTable
. 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
.