Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.06.2015, 13:09   #1
S_007
Форумчанин
 
Регистрация: 22.11.2014
Сообщений: 109
По умолчанию Синхронизация базы данных ACCESS - Delphi

На сервере лежит база данных Access, к ней обращаются несколько компьютеров с одной и той же программой
Можно ли сделать так что если на одном компьютере были внесены изменения в базу, на другом в программе появлялось сообщение, чтоб пользователь нажал кнопку Refresh?
S_007 вне форума Ответить с цитированием
Старый 13.06.2015, 13:14   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да. Используй передачу сообщения через UDP или TCP.
Так же можно включить на компьютерах мессенджер, и посылать текстовое сообщение консольной командой net send.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.06.2015, 13:40   #3
S_007
Форумчанин
 
Регистрация: 22.11.2014
Сообщений: 109
По умолчанию

Stilet Спасибо за ответ!
А если так:
У меня на компе есть база и программа которая с ней работает, я запускаю два раза одну и ту же программу, в одной что то изменяю, сохраняю, перехожу во вторую, я изменения в ней не увижу пока не нажму на навигаторе кнопку Refresh, так можно ли сделать чтоб во второй программе, например в Label появился текст что база была изменена?
Да еще забыл написать подключение ADOConnection - ADOTable
S_007 вне форума Ответить с цитированием
Старый 13.06.2015, 15:31   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я же сказал - Да. Можно. Используй рассылку сообщений.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.06.2015, 17:59   #5
S_007
Форумчанин
 
Регистрация: 22.11.2014
Сообщений: 109
По умолчанию

Stilet, Вы всегда помогали, помогите и счас, как это сделать? Маленький примерчик, или ссылку где можно почитать то что мне надо, пожалуйста, буду очень признателен
S_007 вне форума Ответить с цитированием
Старый 13.06.2015, 18:51   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да не вопрос: http://www.programmersforum.ru/showthread.php?t=24749
Пост от Сержа Близнюкова.
Ну и:
Код:
With TIDUDPClient.Create do begin
 Port:=<нужный>
 Broadcast('Джентльмены, переобновитесь');
 Free;
end;
А у джентльменов кидаешь на форму IdUDPServer, настраиваешь тот же порт, и в событии OnUDPRead показываешь сообщение из параметра AData
I'm learning to live...

Последний раз редактировалось Stilet; 13.06.2015 в 18:55.
Stilet вне форума Ответить с цитированием
Старый 13.06.2015, 20:21   #7
S_007
Форумчанин
 
Регистрация: 22.11.2014
Сообщений: 109
По умолчанию

Stilet, Благодарность Вам безразмерная! Оказывается на подобии тема уже есть на этом форуме, плохо я искал... Конечно я ожидал не очень сложного решения, Ваш пример мне более читабельный но много непонятно, попробую разбираться...
S_007 вне форума Ответить с цитированием
Старый 13.06.2015, 21:47   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Хм...
Код:
unit Unit1;

interface

uses           
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, 
//Подключаем Индейку
  IdSocketHandle ,IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient,
  IdUDPServer, StdCtrls;

type
  TForm1 = class(TForm)
    IdUDPClient1: TIdUDPClient; //Это для посыла сообщения
    IdUDPServer1: TIdUDPServer; //Это для приема
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
//Приемник настраиваем на прослушку порта
IdUDPServer1.DefaultPort:=90;
//И включаем
 IdUDPServer1.Active:=true;

end;

//Когда ему что-то придет, мы обработаем
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
var m:TStringStream;
begin
//Считаем из пришедшего массива байт в строку
m:=TStringStream.Create('');
m.CopyFrom(AData,AData.Size);

//Ну и выведем месседж
caption:=m.DataString;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
//А это пример посыла сообщения на некий хост
 IdUDPClient1.Port:=90;
IdUDPClient1.Host:='localhost';
IdUDPClient1.Send('Я запустился '+IdUDPClient1.LocalName);

//Или на все хосты в сети
IdUDPClient1.Broadcast('Я запустился '+IdUDPClient1.LocalName);
end;

end.
Так понятнее?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.06.2015, 09:36   #9
S_007
Форумчанин
 
Регистрация: 22.11.2014
Сообщений: 109
По умолчанию

Огромное Спасибо Stilet! Очень доступно и понятно! Спасибо Вам Stilet! Прошу прощения за не скромность, можно задать еще пару вопросов...
Никогда не имел с этим дело, но как я понял в каждой программе должен быть такой код но с разными именами IdUDPClient1.Host:='localhost'; и разными портами, IdUDPClient1.Port:=90;, так?
S_007 вне форума Ответить с цитированием
Старый 14.06.2015, 12:19   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Как раз порт должен быть один для всех. Иначе как же твое ПО будет связываться друг с другом?.
Вообще я бы на твоем месте сделал по другому:
1) В БД завел бы некую таблицу, в которой бы при коннекте к БД (по факту при запуске ПО) записывался бы IP, откуда ПО вышло, а при закрытии ПО соответственно запись бы удалялась, или поле IP делалось бы пустым, если есть привязка к пользователю.
2) Использовал бы более надежные и простые IDHHTP компоненты.

Схема тогда была бы следующей:
Отправитель бы действовал так:
Код:
 ADOQuery.sql.text:='INSERT бла-бла чето там в БД пишем...';
 try
  if ADOQuery.Exec>0 then begin
    ADOQuery.sql.text:='Select IP from [Хосты]';
    with TIDHTTP.Create do begin
     while not ADOQuery.Eof do begin
        get('http://'+ADOQuery.Fields[0].AsString+'/inserted?id=<чему-то>');
        ADOQuery.Next;
     end;
     Free;
    end;
  end;
 except
  
 end;
Т.е. после успешной вставки в БД, происходит забор списка, кто он-лайн, и отправка им запроса, с именем документа inserted и параметра id, в котором скажем будет прописан ID вставленной записи (например. Не обзательно один параметр)

Получатель же использует IDHTTPServer, в котором описано событие:
Код:
procedure TForm1.ServerCommandGet(AThread: TIdPeerThread; 
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); 
Var PostedFile:TMemoryStream; 
begin 

  If ARequestInfo.Document='/inserted' Then begin 
   Label.Caption:='Внимание!. Появилась новая запись '+ ARequestInfo.Params['id']+'. Всем Обновиться!!!';
  end;

        With AResponseInfo do begin 
          ContentText:='Ок, уведомление получил'; 
        end;
end;
Эта схема надежнее чем UDP, но у нее есть свои недостатки по скорости. Все зависит от того, что за ПО ты пишешь, как с ним будут работать и кто.
В любом случае, ИМХО, таблица с IP, которые присосались к БД не помешала бы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Базы данных Delphi 7, связка access экспорт в excel,печать. ms_root Фриланс 14 27.03.2015 16:19
Базы данных Access в Delphi Shaggrath Помощь студентам 2 22.04.2012 07:15
Перевод базы данных Access в Delphi с формированием запроса Luba KEr Компоненты Delphi 0 19.04.2010 00:03
База данных Access-Delphi. Считать текущую дату и сравнить ее с датой в ячейки базы. Mollerat БД в Delphi 11 26.01.2010 18:48