PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Si è verificata un'eccezione DBConcurrency durante l'aggiornamento tramite Dataadapter

Questo perché DataAdapter utilizza Optimistic Concurrency per impostazione predefinita. Ciò significa che se stai tentando di aggiornare una riga che non esiste più nel database o modificata, l'aggiornamento da DataAdapter fallirà con l'eccezione di cui sopra.

Possibili scenari :

  • Tra la selezione dei dati nel client e l'invio dell'aggiornamento, un altro utente sta eliminando o aggiornando questa riga dalla sua applicazione.
  • Può darsi che tu stia eliminando i dati da qualche altra parte nella tua applicazione.

Ad esempio :

  1. Compila la DataTable che verrà utilizzato per l'aggiornamento.
  2. Elimina la riga con Code = 1101 (ad esempio) direttamente dal database, ovvero non si utilizza il DataTable qui. Questo sta emulando un altro utente che elimina la riga con Code = 1101 da un'altra applicazione. O qualche altra parte nel tuo codice eliminando la riga con Code = 1101 .
  3. Seleziona la riga con Code = 1101 dalla DataTable , questo è solo per mostrare che è ancora lì anche se l'hai eliminato dal database stesso.
  4. Modifica la Quantity colonna nella riga con Code = 1101 nella DataTable . Questo deve essere fatto, altrimenti la chiamata a Update ignorerà questa riga durante l'aggiornamento.
  5. Esegue l'aggiornamento, questo genererà l'eccezione poiché stai tentando di aggiornare una riga che (non più) esiste nel database.

Se vuoi implementare Last Writer Wins , Aggiungi il seguente codice:

cb.ConflictOption = ConflictOption.OverwriteChanges;

Inoltre c'è un'altra cosa possibile:se hai Decimal /numeric come colonne nel DB possono causare questo errore anche se i dati sembrano gli stessi. Ciò è dovuto a un errore di arrotondamento decimale.

Una nota importante :Dovresti sempre usare parameterized queries a proposito. Questo tipo di concatenazioni di stringhe sono aperte per SQL Injection .