PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

DBConcurrency изключение, възникнало при актуализиране с помощта на Dataadapter

Това е така, защото DataAdapter използва Optimistic Concurrency по подразбиране. Това означава, че ако се опитвате да актуализирате ред, който вече не съществува в базата данни или е променен, актуализацията от DataAdapter ще се провали с изключението по-горе.

Възможни сценарии :

  • Между избора на данните в клиента и изпращането на актуализацията, друг потребител изтрива или актуализира този ред от приложението си.
  • Възможно е да изтривате данните от някъде другаде в приложението си.

Например :

  1. Попълвате DataTable който ще се използва за актуализацията.
  2. Изтрива реда с Code = 1101 (например) директно от базата данни, т.е. не използвате DataTable тук. Това емулира друг потребител, който изтрива реда с Code = 1101 от друго приложение. Или някаква друга част от вашия код, изтриваща реда с Code = 1101 .
  3. Избира реда с Code = 1101 от DataTable , това е само за да покаже, че все още е там, въпреки че сте го изтрили от самата база данни.
  4. Редактира Quantity колона в реда с Code = 1101 в DataTable . Това трябва да се направи, в противен случай извикването на Update ще игнорира този ред при актуализиране.
  5. Изпълнява актуализацията, това ще доведе до изключение, тъй като се опитвате да актуализирате ред, който (вече не) съществува в базата данни.

Ако искате да приложите Last Writer Wins , Добавете следния код:

cb.ConflictOption = ConflictOption.OverwriteChanges;

Също така има още едно възможно нещо:ако имате Decimal /numeric като колони в DB те могат да причинят тази грешка, въпреки че данните изглеждат еднакви. Това се дължи на грешка при закръгляването на десетичната запетая.

Важна забележка :Винаги трябва да използвате parameterized queries между другото. Този вид конкатенации на низове са отворени за SQL Injection .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres FOR LOOP

  2. В PostgreSQL, как да вмъкна данни с команда COPY?

  3. postgreSQL - in vs any

  4. Заявете параметър (настройка postgresql.conf) като max_connections

  5. Хибернация на картографиране между PostgreSQL enum и Java enum