|
SqlDataAdapter.Update в транзакции
|
|||
---|---|---|---|
#18+
Добрый день. Не знаю, как побороть следующую проблему: Хочу чтобы изменения в dataset либо полность сохранялись в базу (если нет ошибок: триггеры, ограничения уникальности, которые прописаны в БД), либо полностью не сохранялись (чтобы пользователь имел возможность все исправить и сохранить заново). Думаю, что это решается с помощью транзакции. Вот написал такой код. Но есть одна проблема: после первой попытки сохранения (если есть ошибки) dset считает, что уже выполнил все изменения для корректных записей (хотя я их откатил) и при повторной апдейте сохраняется только та запись, которая была ошибочной при первом проходе. Как заставить dset откатиться до состояния перед апдейтом? Код сократил, только чтобы видеть суть. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36.
Надеюсь на вашу помощь. Заранее спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2015, 07:20 |
|
SqlDataAdapter.Update в транзакции
|
|||
---|---|---|---|
#18+
Возникла идея: при нажатии на save, создавать копию Dataset и апдейтить ее. Наверное, можно выкрутиться, может есть человеческий метод?) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2015, 11:01 |
|
SqlDataAdapter.Update в транзакции
|
|||
---|---|---|---|
#18+
KOPOJlb, книга "Программирование на ADO.NET 2.0", Дэвид Сеппа, главы 10, 11. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2015, 15:22 |
|
SqlDataAdapter.Update в транзакции
|
|||
---|---|---|---|
#18+
Спасибо, конечно, почитал, узнал много нового, но ответа на вопрос не нашел (может плохо понял?). Похоже нужно делать копию датасета. Т.к. после выполнения апдейта в транзакции строки в дататейбл приобретают RowState = Unchanged. И им глубоко пофиг, что транзакция откатилась. Видимо стандартного методы для этого нет, нужно городить что-то свое. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.05.2015, 10:12 |
|
SqlDataAdapter.Update в транзакции
|
|||
---|---|---|---|
#18+
KOPOJlb, действительно, объект DataSet не знает о транзакции. Он не следит за отложенными изменениями, которые передаются в транзакцию. Откат транзакции не вернёт DataSet в состояние, предшествующее транзакции. В упомянутой книге в разделе "Объекты DataSet и транзакции" (стр. 527) вкратце описано, как поступать в таких случаях. Да, нужно создавать копию датасета. И при неудачной транзакции использовать эту копию. К книге идут примеры кода. В одном из них показан данный сценарий. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.05.2015, 20:17 |
|
|
start [/forum/topic.php?fid=20&msg=38958376&tid=1401546]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 150ms |
0 / 0 |