2013-05-01 4 views
1

간단한 데이터베이스가있는 응용 프로그램을 개발 중입니다. 모든 기능이 잘 작동하지만 사용자가 프로그램에서 데이터베이스를 편집 할 때 다른 사용자는 즉시 내용을 볼 수 없습니다. 다른 사용자는 프로그램을 닫고 다시 열어서 데이터가 나타나도록하고 다른 컴퓨터의 변경 사항으로 DBGrid을 업데이트해야합니다. 나는 이것을 위해 ZeosLib과 Delphi 7을 사용하여 Firebird 데이터베이스에 액세스합니다. DBNavigator에서 새로 고침 버튼을 사용하여 시도했지만 작동하지 않습니다. 나는 데이터베이스에 연결하는 데 사용여러 사용자가 편집 중일 때 TDBGrid가 업데이트되지 않습니다.

구성 요소는 다음과 같습니다

  • ZConnection
  • ZQuery
  • 데이터 소스
  • DBGrid를
  • DBNavigator

이 코드입니다 내 ZConnection 및 ZQuery.

object ZConnection1: TZConnection 
    ControlsCodePage = cGET_ACP 
    UTF8StringsAsWideField = False 
    Connected = True 
    Port = 3051 
    Database = '192.168.254.254:test' 
    User = 'test' 
    Password = 'test' 
    Protocol = 'firebird-2.5' 
    Left = 96 
    Top = 8 
    end 
    object ZQuery1: TZQuery 
    Connection = ZConnection1 
    Active = True 
    SQL.Strings = (
     'select * from "test"') 
    Params = <> 
    Left = 128 
    Top = 8 
     object ZQuery1ID: TStringField 
     FieldName = 'ID' 
     Required = True 
     Size = 8 
    end 
+3

힌트 : http://en.wikipedia.org/wiki/Shift_key. 영어에서는 대문자 (1)를 새 문장의 시작 부분에 사용하고 (2) 단어 'I'에 사용하고 (3) 이름 (예 : 델파이)을 사용합니다. –

+0

감사합니다. 서둘러서 내 게시물을 만들고있어. –

+3

나의 조언 : 서두르지 마라. 너의 시간을 가져라. 정말 좋은 질문을하십시오. 우리가 관심을 가져야한다는 것을 보여주십시오. –

답변

3

ACID과 비슷한 소리입니다. 이것은 SQL 스타일 데이터베이스의 기본 보증이며 모든 데이터베이스 업데이트는 원자, 일관성, 격리 및 내구성이며 트랜잭션을 통해 수행됩니다.

특히 일관성 및 격리 문제로 인해 외부 뷰어가 변경 사항이 둘 이상 포함되어 있어도 완료되기 전에 업데이트를 볼 수 없습니다. 일반적인 예는 은행 송금으로 하나의 계정에서 돈을 뺀 다음 다른 계정에 추가하면됩니다.이 두 가지 작업 중 하나만 표시되고 다른 작업은 표시되지 않으면 불량 데이터가 표시됩니다.

트랜잭션 상태를 데이터베이스 상태에 대한 독립적 인보기로 표시합니다. 모든 데이터베이스 연결에는 고유 한 트랜잭션이 있으며 변경 사항은 트랜잭션을 확약 (완료) 할 때까지 다른 사람에게는 보이지 않습니다 (격리 됨). 트랜잭션의 격리 설정에 따라 트랜잭션이 계속 진행중인 경우에도 트랜잭션을 트랜잭션에 커밋하고 새 트랜잭션을 시작하기 전까지는 다른 사용자에게 보이지 않는 상태로 유지 될 수 있습니다. 귀하의 코드가 이것을 고려하지 않는 것 같습니다.

당신이 즉시 표시되기 위해 업데이트를해야하는 경우가 transaction's isolation mode 여러 가지가 업데이트받을 때 연결된 클라이언트에 알림을 보낼 READ COMMITTEDset up database events 있는지 확인하고 싶을 것이다, 그래서 고객들이 데이터 새로 고침을 수행 할 수 있습니다. 또한 격리 된 데이터를 사용할 수 있도록 사용자 업데이트로 인해 즉시 커밋 작업이 수행되도록해야합니다.

저는 ZeosLib을 사용하지 않기 때문에이 모든 것을 어떻게 설정해야하는지에 대한 모든 세부 사항을 설명 할 수는 없지만 올바른 길을 잡기에 충분합니다.

+0

OIC 이제 원자력, 구성, 격리 및 내구성에 대해 이해합니다. 죄송합니다 제가 이것을 게시했다면 저는 이미 Zeos lib tutorial에서이 글을 읽었습니다. 그러나이 튜토리얼이 무엇을 가리키고 있는지 이해할 수는 없습니다. –

0

그리드를 표시하는 폼에 타이머를 추가하는 것이 좋습니다. 1 분에 1 회 (또는 그 이상) OnTimer 이벤트가 발생하도록 타이머를 설정하십시오. 이 경우 쿼리를 닫은 다음 다시여십시오. 이 방법으로 모든 사람은 항상 최신 정보를 얻습니다 (1 분 늦어도).클라이언트가 알림을 수신해야하는 다중 사용자 응용 프로그램에 대한

with qWhatever do // this is the query which is connected to the grid 
try 
    disablecontrols; 
    close; 
    open 
finally 
    enablecontrols 
end; 
+0

이것은 우아한 해결책이 아니며 많은 문제를 일으 킵니다. 성능은 좋지 않을 것이며, 많은 데이터베이스 트래픽과 사용자가 일부 데이터를 편집하고 있다면 무엇이 있을까요? 그렇게하지 마라! – Andreas

+0

타이머에이 코드를 어디에 넣어야합니까? 1 분 이내에 만들 수 있습니까? 15 초라고합시다. 이 게시물을 주셔서 감사 드리며 또한 이것을 시도 할 것입니다. –

+0

@ChunkChunk : 눈금이 표시된 폼에 타이머를 놓습니다. –

0

은 하나의 옵션은 모든 데이터 변경에 대한 '방송'메시지 전송 (SQL INSERT, UPDATE 또는 DELETE)에 Firebird events을 사용하는 것입니다.

클라이언트는 특정 메시지 유형을 '등록'할 수 있으며 (파이어 버드 서버가이 유형의 메시지를 보낼 때마다 수신하고 클라이언트 애플리케이션 코드를 실행하여 사용자 인터페이스를 새로 고침) (그리드).

많은 간단한 사용 사례에서이 방법이 충분한 해결책 일 수 있지만 몇 가지 제한 사항이 있습니다. 나는 최근에 여기에이 주제에 대해 블로그 :

+0

아주 좋은 기사. 고맙습니다. –

0

내가 쿼리하기 전에이 작업을 추가하여이 문제를 해결 (I 델파이 무료 파스칼을위한 미들웨어 라이브러리의 저자입니다).

IBDatabase1.Close;

IBDatabase1.Open;