2016-10-27 3 views
1

Я занимаюсь разработкой программного обеспечения, которое отображает информацию в DBGrid через TSimpleDataSet (компоненты DBEXPRESS)Auto обновить TDataSet/DBGrid

Программное обеспечение в вопросе используется на 2 разных компьютерах 2 разных людей.

Они оба видят и редактируют одну и ту же информацию в разное время. Я пытаюсь выяснить способ автоматического обновления DBGrid (вернее, DataSet, справа?) На компьютере B, как только компьютер A изменит строку (редактирует что-то/что угодно) и наоборот.

В настоящее время я установил вверх TButton по имени Refresh, что когда-то щелкнул выполняет следующий код:

procedure TForm2.actRefreshDataExecute(Sender: TObject); 

begin 
    dbmodule.somenameDataSet.MergeChangeLog; 
    dbmodule.somenameDataSet.ApplyUpdates(-1); 
    dbmodule.somenameDataSet.Refresh; 
    dbmodule.somename1DataSet.MergeChangeLog; 
    dbmodule.somename1DataSet.ApplyUpdates(-1); 
    dbmodule.somename1DataSet.Refresh; 
    dbmodule.somename2DataSet.MergeChangeLog; 
    dbmodule.somename2DataSet.ApplyUpdates(-1); 
    dbmodule.somename2DataSet.Refresh; 
    dbmodule.somename3DataSet.MergeChangeLog; 
    dbmodule.somename3DataSet.ApplyUpdates(-1); 
    dbmodule.somename3DataSet.Refresh; 
end; 

Это нормально и работает, как задумано, один раз нажал. Я хотел бы воспользоваться функцией автоматического обновления для этого, например, когда Computer A редактирует информацию в строке, компьютер B DBGrid должен обновить его отображение соответственно, без необходимости нажатия кнопки обновления.

Я понял, что буду использовать TTimer и установить его в определенный промежуток времени на обоих программах на обоих ПК.

Мой фактический вопрос:

Есть ли лучший способ, чем TTimer для этого? Если да, пожалуйста, уточните. Кроме того, если TTimer маршрута путь дальнейших данные могут оказаться полезными для государства будет оценен (за и против, и так далее)

Я использую RAD Studio 10 в Сиэтле и dbExpress компонентов, наборы данных подключитесь к базе данных MySQL на моем хостинге, где находится мой сайт.

Спасибо!

+0

Конечно, лучший способ должен быть уведомлен сервером базы данных. Для этого сервер базы данных, если он есть, должен предоставить такую ​​функциональность, а также драйвер доступа должен его поддерживать. DBX, вероятно, не будет, но должно быть возможно использовать вспомогательное соединение. Как и IBEventAlerter, например, для interbase/firebird. –

+0

Почему это было бы лучше, чем против таймера? Просто из любопытства. Кроме того, я использую MySQL и да, наборы данных подключены к базе данных. – Petzy

+1

Ваша программа не должна забивать сервер ни для чего так часто. Вероятно, 99 процентов ваших обновлений будут возвращены с пустыми руками. Если вы растянете интервал, чтобы избежать этого, вы рискуете не уведомлять об изменении. –

ответ

2

Ну, Кен Уайт и Сертак Акюз, безусловно, правильны, что использование уведомления, исходящего из сервера, чтобы определить, когда обновлять локальный набор данных, предпочтительнее постоянно перечитывать все данные, которые вы используете с сервера.

Проблема AFAIK в том, что нет системы уведомлений Emba, которая работает с MySql. Смотрите этот список баз данных, поддерживаемую оповещения базы данных FireDAC по:

http://docwiki.embarcadero.com/RADStudio/XE8/en/Database_Alerts_(FireDAC)

и обратите внимание, что это не список MySql.

К счастью, я думаю, что есть работа, которая должна быть жизнеспособной для небольшой системы, такой как ваша в настоящее время. Насколько я понимаю, вы и компьютеры вашего коллеги находятся в локальной сети, а сервер MySql находится за пределами вашей локальной сети и в Интернете. В этой ситуации вам не нужна обратная поездка на сервер для одного из вас, чтобы получить уведомление о том, что другое что-то изменило в базе данных. Используя аналогию, похожую на Кена, вы можете как бы наклониться над столом и сказать своему коллеге: «Эй, я что-то изменил, поэтому вам нужно обновить ваши данные».

Очень низкотехнологичный способ реализации, который должен был иметь где-то в вашей локальной сети ресурс, с которым вы можете легко добраться, что вы можете обновить при внесении изменений в БД, что означает, что другой вы должны обновить свои данные с сервера.Один из способов сделать это - иметь небольшой общий файл данных с несколькими записями в нем, по одному на таблицу сервера db, который имеет своего рода отметку времени или номер версии, которая обновляется при обновлении соответствующей таблицы сервера. Затем вы можете периодически проверять (опросить) этот файл данных, чтобы увидеть, изменилась ли данная таблица с момента последнего обновления; очевидно, если он есть, вы затем перечитываете данные, которые хотите от него, с сервера, и обновляете локальную запись информации, которую вы читаете из общего файла.

Вы можете обновить общий файл с помощью обработчиков для событий ваших клиентских наборов данных Delphi.

Существует несколько вариантов этой темы, которые, я уверен, будут очевидны для вас; реализационные детали действительно не имеют значения.

Чтобы обновить общий файл, о котором я говорю, вам нужно будет заблокировать его при записи на него. Ответ:

How do I get the handle for locking a file in Delphi?

покажет вам, как сделать это.

Конечно, общий локальный ресурс не обязательно должен быть файлом данных. Одним из вариантов было бы использовать службу Microsoft Message Queue, которая иногда используется для такого рода вещей, но имеет более крутую кривую обучения, чем общий файл данных.

Кстати, такого рода вещи гораздо проще сделать (по крайней мере, в небольшом масштабе, как и у вас), если вы используете доступ к базе данных с тремя уровнями (например, используя datasnap). В трехуровневой системе только средний уровень (сервер данных Delphi, который вы пишете, но это не так сложно) разговаривает с сервером, а клиенты говорят только со средним уровнем. Это позволяет серверу среднего уровня уведомлять другого клиента (клиентов), когда один из них изменяет данные db.

Трехуровневая компоновка также помогает свести к минимуму проблемы с безопасностью при доступе к серверу базы данных через Интернет, поскольку вам требуется только одно защищенное соединение с сервером, а не одно на каждого клиента. Но это немного отклонилось от вашей непосредственной проблемы.

Надеюсь, все это ясно, если нет, спросите.

+0

Чрезвычайно полезно, спасибо, просто прочитайте большую часть материала и попробуйте в ближайшее время. – Petzy

Смежные вопросы