Форум: "Базы";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];
ВнизКак получить внесенные изменения из DBGrid Найти похожие ветки
← →
h0use (2003-12-10 15:32) [0]Есть клиент, который через ADODataSet->DataSource работает с таблицей DBGrid, соответсвено разрешено удалять, изменять и добавлять новые запси в таблицу. Сам ADODataSet заполняется путем скидывания в него recordset полученного на серваке.
procedure TfmMain.SQLData;
var
AStream : TStringStream;
rs : OleVariant;
ados : OleVariant;
xmldata : string;
AString : string;
begin
AStream:=TStringStream.Create(AString);
try
if not GetStreamMsg(AStream) then exit;
AStream.Seek(0,soFromBeginning);
xmldata:=AStream.DataString;
ados:=CreateOleObject("ADODB.Stream");
ados.Open;
ados.WriteText(xmlData);
ados.Position:=0;
rs:=CreateOleObject("ADODB.Recordset");
rs.Open(ados);
dsADOUsers.Recordset:=IUnknown(rs) as _Recordset;
dsADOUsers.Open;
finally // wrap up
FreeAndNil(AStream);
end; // try/finally
end; //
Теперь встала задача изменения отправить на сервак, так, чтоб сервак смог зафиксировать изменения в базе. Соотв. вопрос, как это сделать?
← →
h0use (2003-12-10 17:08) [1]Пробовал слать целиком рекордсет, а потом сравнивать на сервере с оригинальным запросом, но тормоза жуткие при большом кол-ве данных :(
← →
Sandman25 (2003-12-10 17:13) [2]Попробуйте посылать обратно на сервер только те данные, которые изменились.
Кстати, почему Вы не используете стандартную связку TClientDataset-TProvider-источник данных?
← →
sniknik (2003-12-10 17:15) [3]Sandman25 © (10.12.03 17:13) [2]
> Кстати, почему Вы не используете стандартную связку TClientDataset-TProvider-источник данных?
уже предлагал, упирается. ;о))
← →
Sandman25 (2003-12-10 17:24) [4][3] sniknik © (10.12.03 17:15)
:) Понятно
← →
skr (2003-12-10 17:38) [5]а я не понимаю - в SQL фиксация изменений в любой базе происходит методом COMMIT или я чего-то не знаю?
а в противном случае откатывается транзакция...
разьве нет?
← →
h0use (2003-12-10 17:43) [6]
> sniknik ©
> Sandman25
По поводу TClientDataset-TProvider - эта связка не работает для Инди компонент.
> skr
Это все понятно, когда работаешь с локальной базой, но когда у клиента, кроме рекордсета ничего нет, нужно отлавливать изменения в таблице и записывать их в поток, чтоб потом сервак эти изменения уже вносил в базу, да еще всех остальных юзеров пердупреждал, что произошли изменения. Как юзеров преджупреждать, само сабой я знаю и фунциклирует уже, а вот как изменеия отправить серваку, вот тут и загвоздка.
← →
bushmen (2003-12-10 17:43) [7]>skr (10.12.03 17:38) [5]
>а я не понимаю - в SQL фиксация изменений в любой базе >происходит методом COMMIT или я чего-то не знаю?
>а в противном случае откатывается транзакция...
>разьве нет?
В SQL COMMIT фиксируется транзакция, а ее откат происходит методом ROLLBACK
← →
sniknik (2003-12-10 17:57) [8]> По поводу TClientDataset-TProvider - эта связка не работает для Инди компонент.
зачем себя ограничивать? что за мазохистские наклонности? почему нельзя midas soket/dcom конекты, ADO-RDS dcom/HTTPS/HTTP/In-process (хотя In-process понятно почему не пойдет ;о)).
← →
Nikolay M. (2003-12-11 08:59) [9]
> sniknik © (10.12.03 17:57) [8]
Ну, может ему нужно, и все тут? Решил свой транспорт написать, почему бы и нет? Хотя я лично тоже не понимаю, при чем тут Indy. Кстати, исходник scktsrv лежит в \Delphi6\Source\Vcl и его можно легко переделать под свои нужды. А во-вторых, у провайдера есть соответствующие события перед отправкой изменений на сервер, можно на них повеситься и отправлять изменения в любом угодном тебе формате.
← →
h0use (2003-12-11 10:12) [10]
> sniknik ©
"Поздно пить баржоми..." у меня прога уже отлажена и работает с Инди компонентами, потом у нас в локалке с борландовсекми сокетами бывало так, что они "засыпали", т.е. если при соединении с серваком клиент например пару часов ничего ему не посылал, то по неизвестным причинам, пготом приходилось перелогиниваться, с Инди таких проблем не было (специально проверял).
> Nikolay M. ©
Пробовал разобраться как работать с провайдером и с колиентдатасетом, но по примеру от Борланда, только еще больше запутался, а нормальной документации по этому вопросу в инете не нашел.
← →
Nikolay M. (2003-12-11 11:11) [11]
> Пробовал разобраться как работать с провайдером и с колиентдатасетом,
> но по примеру от Борланда, только еще больше запутался,
> а нормальной документации по этому вопросу в инете не нашел.
Плохо искал и не очень-то, похоже, разбирался.
Начни тогда с попсы вроде "Как склепать трехзвенку мышкой" на citforum.
← →
h0use (2003-12-11 11:55) [12]Хорошо, спрошу по другому, какие методы показывают что данные в гриде изменились (отредактировались/удалились/добавились)? Нашел пока только OnRecordsetChangeComplete, но как не пытался вешать на него обработчик, ничего не получается, видимо срабатывает после метода Post. Еще есть OnDataChange, но все попытки повесить на него обработчик получаемого TField приводят к виалейшену еще на стадии загрузки данных в таблицу. Больше ничего не нашел :( Может скажете где...так как это надо, чтоб создавать динамический массив изменений, который после нажатия некой кнопки будет отправлятся на сервак и уже там апдейдить базу.
← →
h0use (2003-12-11 12:54) [13]И все же, я не сомневаюсь, что уважаемые мастера подскажут в каком направлении рыть...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c