![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
![]() Доброго времени суток!
Есть следующая проблемка: требуется отредактировать содержимое базы данных через DBGrid, для этого пишу: по кнопке "перейти в режим редактирования": Код:
DBGrid1.Options:=DBGrid1.Options-[dgRowSelect]+[dgEditing]; DBGrid1.DataSource.DataSet.Edit; по кнопке "сохранить изменения": Код:
t := MessageBox(0 , PChar('Ñîõðàíèòü èçìåíåíèÿ äëÿ òåêóùåé çàïèñè?') , PChar('Âíèìàíèå!') , MB_YESNO + MB_ICONINFORMATION ); case t of IDYES: begin fmChild1.DBGrid1.DataSource.DataSet.Post; fmChild1.DBGrid1.Options:=fmChild1.DBGrid1.Options-[dgEditing]+[dgRowSelect]; ShowMessage('Èçìåíåíèÿ óñïåøíî ñîõðàíåíû!'); end; IDNO: begin fmChild1.DBNavigator1.BtnClick(nbCancel); end; end; Все вроде бы устраивает, кроме 2 пунктов: 1) если одно поле было выделено, но оставлено без изменений, либо очищено - может всплыть ошибка 'DataSource not in edit or insert mode' 2) редактирование приоисходит в режиме "реального времени", т.е., если пользователь ввел данные и нажал на кнопку "сохранить изменения", выбрал пункт "отмена", то отмена произойдет только для последней редактируемой ячейки, нельзя ли сделать так, чтобы отмена происходила для всех внесенных изменений? Помогите, кто чем может.... Memento Mori(арти) |
#2
|
||||
|
||||
![]() 2) Использовать транзакции
1) Проверять состояние таблицы Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
|||
|
|||
![]() используй транзакцию.
при нажатии кноп Edit запускаешь транзакцию. при нажатии кн Отмена- команда отката Transaction1.RollBack при нажати кн Сохранить- Transaction1.Commit; При выполнении этих команд запрос автоматически закрывается. поэтому DBGrid обнуляется. поэтому надо написать процедуру переоткрытия запроса. есть еще команды RollBackRetaining, CommitRetaining- они не закрывают запрос. Поэтому переоткрывать не нужно |
#4
|
||||
|
||||
![]() Я мучаюсь с Access, это правда, что для работы транзакции нужно трехзвенное приложение делать (Приложение на клиенте, которое общается с приложением на сервере, которое уже общается локально с базой)?
Memento Mori(арти) |
#5
|
|||
|
|||
![]() Нет, не правда.
Просто надо приинудительно начать клиентскую транзацию. Если правильно помню - у TADOCOnnection метод StartTransaction. |
#6
|
||||
|
||||
![]() ADOConnection.BeginTrans - начало транзакций,
ADOConnection.CommitTrans - подтвердить транзакции, ADOConnection.RollbackTrans - откат на момент начала транзакций. Обычно используется конструкция такого типа: Код:
try //пытаемся выполнить следующие операции ADOConnection.BeginTrans; //начало транзации ... {Операции с БД} ... ADOConnection.CommitTrans; //подтверждение изменений except // если в блоке try возникла ошибка, то... ADOConnection.RollbackTrans; //откатываем базу (точнее просто не сохраняем изменения) end; В Вашем случаи, на нажатие сохранить - Commit, на Отмена - Rollback. Google в помощь Последний раз редактировалось Ildar-tsr, 14.09.2011 в 07:30. |