Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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(Что тут?).


Наверх

Титульная страница Поиск, карта сайта Написать письмо