2016-10-27 7 views
1

.자동차가 TDataSet의 새로 고침/I가 문제의 소프트웨어는 2 개의 다른 사람들이 서로 다른 컴퓨터에 사용되는</p> <p><code>TSimpleDataSet</code> (dbExpress 컴포넌트)를 통해 <code>DBGrid</code>에 정보를 표시하는 소프트웨어를 개발하고 있어요 DBGrid를

그들은 서로 다른 시간에 동일한 정보를보고 편집합니다. 컴퓨터 A가 행을 변경 (무언가를 수정하는 경우)하거나 그 반대 인 경우 컴퓨터 B에서 DBGrid (또는 오히려, 오른쪽)을 자동으로 업데이트하는 방법을 알아 내려고하고 있습니다.

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; 

이 괜찮 의도 한대로, 한 번 클릭 작품 :

은 현재 내가 한 번 클릭 Refresh라는 TButton 다음 코드를 실행 설정했습니다. 예를 들어 컴퓨터 A가 행의 정보를 편집 할 때 컴퓨터 B의 DBGrid이 새로 고침 버튼을 클릭하지 않아도 디스플레이를 업데이트해야하는 경우 자동 업데이트 기능이 필요합니다.

TTimer을 사용하고 특정 간격으로 PC의 두 소프트웨어에서 모두 설정할 것이라고 생각했습니다.

내 실제 질문은 : 이것에 대한 TTimer보다 더 좋은 방법은

있습니까? 그렇다면 정교하게 작성하십시오. 또한 의 TTimer 경로 (프로의 양론의 등)

내가 라드 스튜디오 (10) 시애틀과 dbExpress 구성 요소, 데이터 세트를 사용하고 감상 할 수있다 당신이 상태로 유용 할 수있는 추가 정보를 길을 가야하는 경우 내 웹 사이트가있는 내 호스팅에서 MySQL 데이터베이스에 연결하십시오.

감사합니다!

+0

물론 더 좋은 방법은 데이터베이스 서버에 의해 통지하는 것입니다. 이를 위해 데이터베이스 서버가있는 경우 이러한 기능을 제공해야하며 액세스 드라이버도이를 지원해야합니다. DBX는 지원하지 않지만 보조 연결을 사용할 수 있어야합니다. 예를 들어 interbase/firebird에 대한 IBEventAlerter와 같습니다. –

+0

왜 타이머가 아닌 더 나은 방법일까요? 그냥 호기심. 또한 MySQL을 사용하고 있습니다. 예, 데이터 집합이 데이터베이스에 연결되어 있습니다. – Petzy

+1

프로그램이 서버를 너무 자주 망치질 할 필요는 없습니다. 아마도 당신의 새로 고침의 99 %가 빈 손으로 반환하는 것입니다. 이를 피하기 위해 간격을 늘리면 변경 사항을 알리지 않을 위험이 있습니다. –

답변

2

Ken White와 Sertac Akyuz는 서버에서 사용하는 모든 데이터를 지속적으로 다시 읽는 것이 서버에서 생성 된 알림을 사용하여 로컬 데이터 집합을 새로 고칠시기를 결정하는 것이 좋습니다.

문제는 AFAIK는 MySql에서 작동하는 Emba 제공 알림 시스템이 없다는 것입니다.

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

을하고 MySQL을 나열하지 않습니다 : FireDAC의 데이터베이스 에이전트에 의해 지원되는 데이터베이스의 목록을 참조하십시오.

운 좋게도, 현재 당신과 같은 대용량 시스템에서 사용할 수있는 해결 방법이 있다고 생각합니다. 내가 알기에 당신과 동료의 PC는 LAN에 있으며 MySql 서버는 LAN과 인터넷에 없습니다. 이 경우 다른 사용자가 데이터베이스에서 변경된 사항을 알리기 위해 서버를 왕복 할 필요가 없습니다. Ken과 비슷한 비유를 사용하면 책상 위에 앉아서 동료에게 "이봐, 나는 뭔가를 바꿨다. 따라서 데이터를 새로 고쳐야한다"고 말할 수있다.

매우 낮은 기술을 구현하면 LAN에 어딘가에 쉽게 접근 할 수있는 리소스가있는 것이므로 DB를 변경할 때 업데이트 할 수 있습니다. 서버에서 데이터를 업데이트해야합니다.이를 수행하는 한 가지 방법은 해당 서버 테이블을 업데이트 할 때 업데이트되는 일종의 타임 스탬프 또는 버전 ID 번호가있는 서버 db 테이블 당 하나의 레코드가있는 작고 공유 된 데이터 파일을 만드는 것입니다. 그런 다음 주기적으로이 데이터 파일을 확인 (폴링)하여 마지막으로 체크 한 후 주어진 테이블이 변경되었는지 여부를 확인할 수 있습니다. 분명히, 그렇다면 서버에서 원하는 데이터를 다시 읽고 공유 파일에서 읽은 정보의 로컬 레코드를 업데이트하십시오.

Delphi 클라이언트 측 데이터 세트의 이벤트에 대한 핸들러를 사용하여 공유 파일을 업데이트 할 수 있습니다.

이 테마에는 여러 가지 변형이 있습니다. 구현 세부 사항은 실제로 중요하지 않습니다.

내가 말하는 공유 파일을 업데이트하려면 파일을 쓰는 동안 잠글 필요가 있습니다. 이 답변 :

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

어떻게 그렇게하는 방법을 보여줍니다.

물론 공유 로컬 리소스는 데이터 파일 일 필요는 없습니다. 한 가지 대안은 Microsoft Message Queue 서비스를 사용하는 것입니다.이 서비스는 이러한 종류의 경우에 사용되기도하지만 공유 데이터 파일보다 학습 곡선이 더 깁니다.

3 계층 데이터베이스 액세스 (예 : datasnap 사용)를 사용하는 경우 이러한 종류의 작업을 수행하는 것이 훨씬 쉽습니다 (최소한 소규모). 3 티어 시스템에서는 중간 계층 (작성하는 Delphi 데이터 서버이지만 어렵지 않습니다)이 서버와 통신하며 클라이언트는 중간 계층과 만 통신합니다. 이렇게하면 중간 계층 서버가 다른 클라이언트 (들) 중 하나가 db 데이터를 변경할 때이를 알리기 쉽습니다.

3 계층 배열을 사용하면 클라이언트 당 하나의 서버가 아닌 서버에 보안 연결이 하나만 필요하기 때문에 인터넷을 통해 데이터베이스 서버에 액세스 할 때 보안 문제를 최소화 할 수 있습니다. 그러나 그것은 당신의 즉각적인 문제에서 조금 벗어난 것입니다.

이 모든 것이 명확 해지기를 바랍니다. 그렇지 않은 경우 문의하십시오.

+0

매우 도움이됩니다. 고맙습니다. 대부분의 내용을 읽고 곧 시도 할 것입니다. – Petzy