![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| MFSham |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 28.8.2005 Где: Беларусь, Гродно Репутация: нет Всего: 3 |
Изучаю NHibernate. Решил вот переделать(а заодно и попробовать в действии NHibernate) свой проект, который работал на Typed DataSet. (БД - MSSQL 2005)
Использую DataSet в моем приложении пользователь мог внести ряд изменений в БД, открыв при том соответствующее окно редактирования. При его закрытии спрашивалось, сохранять ли изменения в БД. Соответственно если хотел - AcceptChanges, иначе откат. Т.к. база была отсоединена, соответственно все изменения производились в DataSet'e, то и все было хорошо. В Hibernate'e же все изменения заносятся сразу в БД. Конечно можно при открытии формы запустить одну единственную сессию с транзакцией, которая будет висеть открытой на протяжении всей работы с формой, и при закрытии и отказе сохранения делать RollBack. Но считаю это не эффективным и геморойным решением. Может можно как-то установить точку сохранения на которую можно будет откатить БД? Или еще чего? --------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны. |
|||
|
||||
| Veitmen |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 288 Регистрация: 10.11.2006 Где: СПБ Репутация: 3 Всего: 4 |
Не правильно рассуждаешь. Открытие и закрытие транзакции нужно там, гду ты уже сохраняешь объект в БД, а не при открытии формы. Работаешь так:
- Открыл форму - Пользователь все вводит нажимает сохранить - Создаешь объект хибера и заполняешь его, при заполнении идет рповерка значений - ЗАполнил, передаешь этот объект в какой нить свой класс, типа контроллера и сохраняешь его там. Сохранение в котроллере:
Получается что твоя транзакция нужна только при сохранении. Добавлено @ 09:03
То есть ты уже занес в DataSet данные и если пользователь не хочет сохранять, тогда Rollback???? А спросить и в зависимости от этого просто начинать сохранять или не сохранять даже... Это сообщение отредактировал(а) Veitmen - 5.12.2007, 09:04 |
||||
|
|||||
| MFSham |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 28.8.2005 Где: Беларусь, Гродно Репутация: нет Всего: 3 |
В том то и загвоздка, что пользователя спрашивают 2 раза: 1 раз сохранить локально, чтобы не потерялась проделанная работа, а второй раз при закрытии формы, сохранить ли все наработки в БД.
Так вот, когда спрашиваю 1 раз - соответственно открываю транзакцию, сохраняю, закрываю. Таких сохранений может быть много. Т.е. транзакция открывается ни один раз. 2 раз я спрашиваю при закрытии формы о сохранении в БД. Вот тут то и получается, что данные то уже сохранены в БД, соответственно и откатить их нельзя. Вот и спрашиваю как быть. --------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны. |
|||
|
||||
| Veitmen |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 288 Регистрация: 10.11.2006 Где: СПБ Репутация: 3 Всего: 4 |
Если ты работаешь с БД локально без соединения, т.е. через DataSet, то тебе транзакции и не нужны будут. Просто перед добавлением в DataSet спрашивай его, хочет он или нет. А вот при закрытии, спрашивай хочет ли он сохранить и потом начинай сохранять свой DAtaSet. Там уже транзакции тебе понадобятся. А вообще, я не понимаю зачем ты так делаешь. Спрашивай у юзверя одни раз, уверен он или нет. Уверен начинай сохранять. При сохранении ошибка, откатываешь транзакцию. Вот так мне кажется гораздо вернее сделать. Чем переспрашивать у бедного юзверя.)) Транзакция, нужна только при работе с самой БД. Но не как не с DataSetом. Это сообщение отредактировал(а) Veitmen - 5.12.2007, 16:06 |
|||
|
||||
| Veitmen |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 288 Регистрация: 10.11.2006 Где: СПБ Репутация: 3 Всего: 4 |
http://www.codeproject.com/KB/architecture...chitecture.aspx - хорошая реализация работы транзакций под хибернейт.
|
|||
|
||||
| MFSham |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 28.8.2005 Где: Беларусь, Гродно Репутация: нет Всего: 3 |
C DataSet у меня все пректасно работает. Согласен, что 2 раза у юзверя спрашивать это глупо, но в моей ситуации это оптимальный вариант. Да и просят так сделать =\ Я все-таки сделал как хотел, но немного по другому. Пользователь загружает в окно для изменений определенный набор данных (в моем случае это небольшой набор). Я их соответственно при загрузке формы загружаю в массив объектов. И если юзверь что-то изменил, то изменяю только в массиве. Ну а при закрытии, если надо сохранить, то данные из этого массива сохраняю в БД. Но это прокатывает в моем случае, если данные занимают малый размер. Думаю с большим набором данных это не особо прокатит. --------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны. |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |