![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли отловить событие добавления записи в таблицу БД Access? [D5, Access]
Рустем © (2006-03-27 15:32:00)Можно ли отловить событие добавления/изменения/удаления записи(ей) в таблицу БД Access и каким образом?
В моем случае данные из таблицы представляются на экране клиента в графическом виде. Так вот мне необходимо отловить выше указанное событие для перерисовки изображения. Есть ли у кого-нибудь хоть какие-либо соображения, кроме как использовать кнопку "Обновить"?
piople (2006-03-28 06:20:00) [1]Да на самом деле тригер бы облегчил задачу... да и вообще если сама процедура построение графика не долгая и не ресурсоемкая то почему бы просто например раз в 10 секунд не обновлять ее и все?
А так же на всяк случай, статейка:
> { **** UBPFD *********** by delphibase.endimus.com ****
> >> Обратная связь от MSSQL-сервера к клиенту
>
> На форуме постоянно возникает вопрос -
> "Как получить обновление данных, по событию, а не таймером",
>
> чтобы снять его раз и навсегда привожу код dll-ки, которая
> является Extended Stored Procedure с единственной функцией
> -
> отправкой UDP-broadcast сообщения.
>
> Зависимости: Windows, SysUtils, IdUDPClient
> Автор: Delirium, VideoDVD@hotmail.com, ICQ:118395746,
> Москва
> Copyright: Delirium (Master BRAIN) 2003
> Дата: 24 октября 2003 г.
> ***************************************************** }
library Messager;
uses
Windows,
SysUtils,
IdUDPClient;
function srv_rpcparams(srvproc: Pointer): integer; cdecl; external 'opends60.dll'
name 'srv_rpcparams';
function srv_paramdata(srvproc: Pointer; n: integer): integer; cdecl; external
'opends60.dll' name 'srv_paramdata';
function srv_paramlen(srvproc: Pointer; n: integer): integer; cdecl; external
'opends60.dll' name 'srv_paramlen';
procedure SendUDPMessage(Params: Pointer); stdcall; cdecl; export;
var
id: TIdUDPClient;
Msg: string;
Host, Port: string;
begin
try
if srv_rpcparams(Params) < 2 then
exit;
Host := Copy(PChar(srv_paramdata(Params, 1)), 1, srv_paramlen(Params, 1));
Port := Copy(Host, Pos(':', Host) + 1, Length(Host));
Delete(Host, Pos(':', Host), Length(Host));
Msg := Copy(PChar(srv_paramdata(Params, 2)), 1, srv_paramlen(Params, 2));
id := TIdUDPClient.Create(nil);
id.BroadcastEnabled := True;
id.Host := Host;
id.Port := StrToInt(Port);
id.ReceiveTimeout := -1;
id.Send(Msg);
id.Free;
except
end;
end;
exports SendUDPMessage;
begin
end.
> Пример использования:
>
> Для регистрации на MSSQL скопировать dll в c:\Program Files\Microsoft
> SQL Server\80\Tools\Binn и исполнить скрипт sp_addextendedproc
> 'SendUDPMessage', 'Messager.dll' На клиенте рекомендую использовать
> компонент TIdUDPServer. Передача сообщений осуществляется
> так exec SendUDPMessage '255.255.255.255:8080', 'Привет!
> ' где 255.255.255.255 - broadcast маска, но можно написать
> и конкретный адрес (192.168.1.10), 8080 - выбранный для
> использования порт.
Ega23 (2006-03-27 17:50:00) [2]
> нет триггеров... access...
В access - нету?
Вах....
sniknik (2006-03-27 17:48:00) [3]Ega23 © (27.03.06 17:38) [6]
нет триггеров... access...
Ega23 (2006-03-27 17:38:00) [4]Триггер на каждую таблицу. Штоб писал в специальную таблицу про изменения.
Но это уже изврат, обновление данных на клиенте должно происходить сознательно.
sniknik (2006-03-27 17:27:00) [5]> оказывается DateUpdate показывает дату создания/модификации таблицы ...
да, точно. ;(
можно еще время изменения файла (*.mdb) смотреть, но это будет изменение во всей базе, не деля по таблицам.
Рустем (2006-03-27 17:15:00) [6]
> sniknik © (27.03.06 15:41) [2]
> событий нет, читай переодически системную
> SELECT Id, DateUpdate, Name FROM MSysObjects
> и сравнивай DateUpdate
Ну вот и появились проблемы: оказывается DateUpdate показывает дату создания/модификации таблицы, а не дату внесенных изменений в плане добавления/изменения/удаления записей. Так что этот вариант не подходит...
Рустем (2006-03-27 15:46:00) [7]
> sniknik ©
Спасибо, попробую...
sniknik (2006-03-27 15:41:00) [8]событий нет, читай переодически системную
SELECT Id, DateUpdate, Name FROM MSysObjects
и сравнивай DateUpdate. только учти, оно не "живое реалтаймовское", будут задержки изза буферизации в ядре jet-а. (задержки даже в одном приложении при 2 конектах видны)
Sergey13 (2006-03-27 15:36:00) [9]Если записи обновляются вне работающего приложения - ИМХО никак не определишь. Только кнопка или таймер. Кнопка лучше всего (даже если можно отследить событие) - во веки веков. Аминь. 8-)