Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.013 c
4-25671
Dido
2003-11-06 22:32
2004.01.09
Как создать обработчик события OnMouseClick у компонента Animate?


1-25333
vixic
2003-12-22 14:52
2004.01.09
Свойство ObjectText


14-25590
Maxim Vetera
2003-12-17 10:00
2004.01.09
Код Delphi на VB!


1-25344
Романов Р.В.
2003-12-19 14:18
2004.01.09
Com в dll + Excel


3-25252
Avsam
2003-12-09 19:13
2004.01.09
Выбор SQL базы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский