2012-12-12 2 views
9

내 Datasnap 클라이언트 응용 프로그램에서 내 메서드 및 ProviderConnection에 대해 1 TSQLConnection을 사용합니다. 연결이 끊어 질 때 문제가 발생합니다. TSQLConnection.Connected와 TSQLConnection.ConnectionState 모두이 정보를 가져 오지 않습니다.클라이언트 - 서버 연결을 통해 Mannaging SQLConnection/Datasnap

내 TSQL 연결이 열려 있지만 인터넷 연결이 끊어 지거나 서버가 중지됩니다. Datasnap 클라이언트 응용 프로그램에서 많은 오류가 발생합니다. (서버 메서드 또는 ClientDataSet)

내 서버 메서드에 대한 SQL 연결을 관리하는 함수를 만들었습니다. 예를 들어 TDSProviderConnection을 통해 연결된 ClientDataset이 가까이에있을 때 더 많은 문제가 발생합니다.

Q : 클라이언트 응용 프로그램을 관리하여 TSQL 연결의 모든 연결을 안전하게 잡으려면 어떻게해야합니까? Q : 어떻게하면 다운 타임을 어떻게 관리합니까? 그리고 저장하지 않은 클라이언트 상태를 어떻게 처리합니까?

가동 중지 후 재 연결은 문제가 아닙니다.

servermethod를 호출 할 때 예외가 발생합니다.

tmpM:=TServerMethodsClient.Create(MYTSQLCONNECTION.dbxconnection,true); 

그래서 나는 더미 방법으로 내 데이터 모듈에서를 TSQLConnection을 얻기 위해 다음 방법을 쓰기. 연결이 끊어 여부를 확인하는 유일한 방법은 ... 같은 오류를 슬로우 다음 내가 재 연결 또는 가까운 프로그램에 조회 할 수 있습니다 더미 방법 느릅 나무를 통해 때문에

function TDMForm.DSConnection: TSQLConnection; 
var 
    tmpM:TServerMethodsClient; 
begin 
    result:=nil; 
    if assigned(MYTSQLCONNECTION) then begin 
    tmpM:=TServerMethodsClient.Create(MYTSQLCONNECTION.dbxconnection,true); 
    try 
     try 
     tmpM.Ping; 
     result:=MYTSQLCONNECTION 
     except 
     ReconnectForm.ShowModal; // has a reconnect button that tries to reconnect + shutdownbutton 
     if ReconnectForm.modalresult=mrOK then 
      result:=MYTSQLCONNECTION 
     else 
      MainForm.Close; 
     end; 
    finally 
     tmpm.Free; 
    end; 
    end; 
end; 

가 나는 방법이 방법을 썼다.

편집 : (나는 일반적인 대답과 지침 수행의 어떤 종류를 기대하고있어 내 코드의 안 보정, 이것이 바로 내가 지금 뭐하는 거지 보여되지 않습니다.).

답변

3

우리는 똑같은 문제, 즉 연결이 끊어 졌을 때를 감지하는 방법과 정상적으로 다시 연결하는 방법으로 어려움을 겪었습니다. 여기에 우리가 일을 끝내 었는데, 그것은 우리에게 매우 성공적이었습니다.

사용자가 DataSnap 서버에 연결하여 데이터를 검색하고 변경합니다. 모든 레코드 생성, 업데이트 및 삭제는 OnBeforePostOnBeforeDelete 이벤트 처리기를 통해 TClientDataSet에 즉시 데이터베이스에 제공됩니다.

서버와 통신을 시도하고 연결이 끊어진 것을 알기 전까지는 클라이언트가 DataSnap 서버에서 강제로 연결이 해제 된 것을 감지 할 수 없기 때문에 우리 앱의 메인 폼에 TApplicationEvents을 추가했습니다 OnException 이벤트에 대한 이벤트 처리기를 작성했습니다. EIdSocketError이 표시되면 연결이 끊어 졌음을 알게되므로 사용자에게 많이 알리는 메시지를 표시 한 다음 또는 Delete이 로컬 데이터 집합에서 발생하지 않도록 Abort으로 전화하십시오. 사용자는 다시 로그인 한 다음 또는 을 다시 저장하여 을 다시 클릭하여 이전 작업을 완료 할 수 있습니다.그것은 일반적으로 DB 오류가 외부 키 또는 고유 키 위반과 같은 발생을 의미하기 때문에

procedure TMainForm.AppEventsException(Sender: TObject; E: Exception); 
begin 
    if E is EIdSocketError then 
    begin 
    AppEvents.CancelDispatch; 
    MessageDlg('The connection to the database was lost. You must log in before you retry the failed action. Actual error message:'#13#10#13#10 + E.Message, mtError, [mbOK], 0); 
    Abort; 
    end; 

    if E is TDBXError then 
    begin 
    AppEvents.CancelDispatch; 
    MessageDlg('The database returned an error. If you cannot correct the issue, please contact customer service with the following database error message:'#13#10#13#10 + E.Message, mtError, [mbOK], 0); 
    Abort; 
    end; 

    // Show any other unhandled exceptions 
    Application.ShowException(E); 
end; 

TDBXError는 다른 우리의 함정 :

우리의 글로벌 예외 핸들러는 다음과 같이 보인다. 데이터베이스에서 변경이 이루어지지 않았으므로 Abort 변경 사항이 로컬에서 발생하므로 db와 동기화됩니다.

OnBeforePostOnBeforeDelete을 통해 db와의 동기화를 처리하는 방식 때문에 연결이 끊어져 사용자가 다시 연결되어 새로운 DataSnap 세션을 가져 오는 것은 중요하지 않습니다. 사용자가 변경 사항을 잃지 않고도 DataSnap 서버를 다시 시작할 수 있습니다. 단지 다시 로그인 한 후 을 클릭하십시오. 아무것도 잃어 버리지 않습니다.

첫 번째 질문에 대한 답변은 모두 ... 언젠가는 TClientDataSet을 사용자의 HDD에 저장할 수있는 오프라인 모드를 구현하고 다음에 로그인 할 때 동기화를 수행하여 모든 로컬 변경 사항을 저장했습니다. 그러나 우리는 아직 그 일을하지 않았습니다 - 그래서 나는 두 번째 질문에 대해 좋은 대답을하지 못합니다.

+0

당신은 "사용자가 다시 로그인 할 수 있습니다."라고 말하면서 어떻게 말 했는가? 내 자신의 Datasnap 응용 프로그램에서 TSQLConnection1.Connected : = False에 대한 호출도 서버 (더 이상 존재하지 않음)에게 뭔가를 말하려고하기 때문에 예외 (10053)를 발생시킵니다. 나는 여기 캐치 22에있다. 어떻게 그 주위를 돌아 다녔습니까? – nolaspeaker

+1

@nolaspeaker - 다시 인증 할 것이라는 것을 알고 있기 때문에 예외에 대해서는별로 신경 쓰지 않습니다. 그래서 그냥'try sqlcon.Close; except end;;, 어떤 예외를 먹는다. 그런 다음 자동으로 다시 인증하거나 수동으로 로그인 대화 상자를 표시하여 사용자가 직접 로그인 할 수 있습니다. –

+0

네, 그 핸들링은 나에게도 일어났습니다. :-) 응답 해 주셔서 감사합니다. – nolaspeaker

관련 문제