sql >> Databáze >  >> RDS >> PostgreSQL

Při aktualizaci pomocí Dataadapter došlo k výjimce DBConcurrency

Důvodem je DataAdapter používá Optimistic Concurrency ve výchozím stavu. To znamená, že pokud se pokoušíte aktualizovat řádek, který již v databázi neexistuje nebo se změnil, aktualizace z DataAdapter se nezdaří s výjimkou výše.

Možné scénáře :

  • Mezi tím, co vyberete data do klienta a odešlete aktualizaci, jiný uživatel smaže nebo aktualizuje tento řádek ze své aplikace.
  • Je možné, že smažete data odjinud ve své aplikaci.

Například :

  1. Vyplníte DataTable který bude použit pro aktualizaci.
  2. Smaže řádek s Code = 1101 (například) přímo z databáze, tj. nepoužíváte DataTable tady. Toto je emulace jiného uživatele, který odstraňuje řádek s Code = 1101 z jiné aplikace. Nebo nějaká jiná část kódu, která odstraní řádek s Code = 1101 .
  3. Vybere řádek s Code = 1101 z DataTable , je to jen pro ukázku, že tam stále je, i když jste jej smazali ze samotné databáze.
  4. Upraví Quantity sloupec v řádku s Code = 1101 v DataTable . Toto je nutné provést, jinak bude volání Update tento řádek při aktualizaci ignorovat.
  5. Provede aktualizaci, vyvolá výjimku, protože se pokoušíte aktualizovat řádek, který (již) v databázi neexistuje.

Pokud chcete implementovat Last Writer Wins , Přidejte následující kód:

cb.ConflictOption = ConflictOption.OverwriteChanges;

Také je zde ještě jedna možná věc:pokud máte Decimal /numeric jako sloupce v DB mohou způsobit tuto chybu, i když data vypadají stejně. To je způsobeno chybou zaokrouhlování desetinných míst.

Důležitá poznámka :Vždy byste měli používat parameterized queries mimochodem. Tento druh zřetězení řetězců je otevřený pro SQL Injection .




  1. Je možné spustit řetězec v MySQL?

  2. Použití ODBC se Salesforce a Azure Active Directory (AD) Single Sign On (SSO)

  3. Nelze vytvořit datový model entity - pomocí MySql a EF6

  4. Připojte se v Oracle SQL