![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ClientDataSet [FB 1.0]
Term © (2004-05-11 11:17:00)MIDAS.
Вопрос такой, добавляю запись в ClientDataSet делаю ApplyUpdates(), но запись оказывается в БД только после разрыва соединения TSocketConnection, ну это и естественно т.к. транзакция подтверждается при разрыве, но как сделать так чтобы её сразу подтверждать.
Term (2004-05-11 17:54:00) [1]
>Надо бы saCommit
так и есть!!!!!!!!!! буду пробывать, если поможет с меня ящик водки и жаренный баран
Romkin (2004-05-11 17:40:00) [2]Угу. Чего-то не хватает...
У тебя случайно TIBTransaction.AutoStopAction не в saNone установлено? Надо бы saCommit, чтобы транзакция закрывалась, когда датасеты ее закрыты все...
Term (2004-05-11 17:26:00) [3]
> это не он ее открыл либо не все данные взяты
добавляю ОДНУ запись, после закрытия SoketConection, она в БД, значит всё передалось.
А кто как не он её открывает если, я просто связываю компоненты, и ClientDataSet делаю active:=true;
потом:
ClientDataSet.append;
...
ClientDataSet.Post;
ApplyUpdates(0);
всё просто, но видать чего то не хватает, вот я и интересуюсь чего именно, вроде всё связанно как и описанно в выше указанных статьях
Romkin (2004-05-11 16:51:00) [4]Работой с транзакциями должен заниматься провайдер. Обычно так и происходит. Если транзакцию он не закрыл - значит, это не он ее открыл либо не все данные взяты.
Term (2004-05-11 16:15:00) [5]а если на клиенте только TSoketConection и TClientDataSet как мне подтвердить транзакцию, там нет никаких Commit ведь.
Term (2004-05-11 15:52:00) [6]
> Здесь что-то не так. Транзакция закончивается commit transaction
> по единому правилу : "или всё или ничего". Уточни контекст
> использования ApplyUpdates(). ApplyUpdates(Что тут?).
использую сервер FB 1.0, компонент доступа TIBDataSet и TIBTransaction находятся в TRemoteDataModule т.е. на сервере приложений, с TIBDataSet связан DataSetProvider1.
На клиенте лежит TSocketConnection через него подключен TClientDataSet и у него прописанно св-во ProviderName DataSetProvider1. Делаю ClientDataSet1.Active:=true; вижу записи в БД, добавляю запись делаю ApplyUpdates(0), и пока не закрою TSocketConnection транзакция не подтверждается
Term (2004-05-11 15:36:00) [7]
> if ClientDataSet.ApplyUpdates(0 или -1) = 0 then
> begin
> ClientDataSet.Refresh;
> Result := True;
> end
т.е. по логике послеApplyUpdatesнадо делатьRefreshчтобы подтвердить транзакцию???
31512 (2004-05-11 14:31:00) [8]
> Меня именно заинтересовало, почему MIDAS?
Я могу рассказать только почему я выбрал MIDAS.
Мне нужна была многоуровневость.
В кратце:
1. Логика БД и работы с ней, отделена от клиента, а клиентское приложение предоставляет лишь удобную форму представления данных.
2. Нет зависимости от платформы БД.
3. Все этапы работы с БД прозрачны и просто настраиваются.
В моём случае MIDAS мне подходит более всего.
В других случаях, он может и не найти применения.
Можно почитать тут
http://www.delphimaster.ru/articles/midas/index.html
http://www.delphimaster.ru/articles/midas2/index.html
Курдль (2004-05-11 14:04:00) [9]Меня именно заинтересовало, почему MIDAS?
31512 (2004-05-11 13:06:00) [10]
> Глянул я на ТSocketConnection - ничче сказать не могу. :(
> И не знаю, чем обусловлено применение ТClientDataSet у Вас.
А потому, что MIDAS. Можно посмотреть тут http://rsdn.ru/article/db/midas.xml/
+
Тейксейра с Пачекой (двухтомник по Delphi 5), том 2, Часть IV, Глава 32. Особенно стр. 736. Интересная там схемка имеется.
Курдль (2004-05-11 12:54:00) [11]Глянул я на ТSocketConnection - ничче сказать не могу. :(
И не знаю, чем обусловлено применение ТClientDataSet у Вас.
31512 (2004-05-11 12:13:00) [12]Для Курдль
> Что-то глаз режет... Я почти не работал с ClientDataSet
В моём контексте, это мне показалось приемлемым решением. Готов рассмотреть предложения по поводу кода, где требуется по нажатии кнопки записать изменения в БД. Разница лишь названиях этих ClientDataSet. Вот я и написал единую для всех функциию и передаю туда тот ClientDataSet, для которого мне нужно выполнить сохранение. Готов рассмотреть предложения.
Курдль (2004-05-11 11:59:00) [13]
> Следующий код в моём приложении работает железно.
Что-то глаз режет... Я почти не работал с ClientDataSet, но если для него надо выделывать такое, то и не буду.
Общее правило для утверждения изменений -DB.ApplyUpdates([DataSet1, ... DataSetN),где DB - компонент сессии с БД.
31512 (2004-05-11 11:51:00) [14]Следующий код в моём приложении работает железно.
function SaveChanges(ClientDataSet : TClientDataSet) : boolean;
begin
Result := False;
if (ClientDataSet.ChangeCount > 0) then
begin
if ClientDataSet.ApplyUpdates(0 или -1) = 0 then
begin
ClientDataSet.Refresh;
Result := True;
end
else Result := False;
end;
end;
31512 (2004-05-11 11:45:00) [15]
> транзакция подтверждается при разрыве
Здесь что-то не так. Транзакция закончивается commit transaction
по единому правилу : "или всё или ничего". Уточни контекст использования ApplyUpdates(). ApplyUpdates(Что тут?).