Q&A

  • [질문] 3티어 개발시 쿼리 조회 문제
개발환경은 2010과 DataSnap 환경입니다.
아래처럼 서버와 클라이언트 코드가 있습니다.
클라이언트에서 서버쪽으로 파라메터를 넘기면 서버에서는 쿼리를 실행하여
그 결과를 클라이언트에 보여주려고 합니다.
이 상태에서 실행하면 데이터가 한건도 없습니다.

반대로 클라이언트에서 서버로 쿼리를 직접 날리면 데이터는 정상적으로 검색됩니다.

서버쪽 코드
<!--CodeS-->
function TServerMethods1.GetServerData( Parm  : String  ) : TDataSet;
var
  MAIN_SQL  : String;
begin
  MAIN_SQL  :=  '';
  MAIN_SQL  :=  MAIN_SQL  + #13 + 'SELECT ';
  MAIN_SQL  :=  MAIN_SQL  + #13 + '             ITM04_ENTCOD ';
  MAIN_SQL  :=  MAIN_SQL  + #13 + '       FROM  ';
  MAIN_SQL  :=  MAIN_SQL  + #13 + '             ITM04_CLAS4 ';
  MAIN_SQL  :=  MAIN_SQL  + #13 + '       WHERE ';
  MAIN_SQL  :=  MAIN_SQL  + #13 + Format( '     ITM04_ENTCOD  = ''%s''  ',  [ Parm  ] );

  SQLDataSet1.CommandText   :=  MAIN_SQL;
  SQLDataSet1.Open; //  데이터를 가져올 수 있도록 한다.
  Result  :=  SQLDataSet1;
end;
<!--CodeE-->

클라이언트쪽 코드 (데이터 검색 않됨)
<!--CodeS-->
procedure TClientForm.Button2Click(Sender: TObject);
var
  Server  : TServerMethods1Client;
begin
  DataModule1.SQLConnection1.Open;
  Server  :=  TServerMethods1Client.Create( DataModule1.SQLConnection1.DBXConnection  );

  try
    DataModule1.ClientDataSet1.Close;
    Server.GetServerData( Edit1.Text  );
    DataModule1.ClientDataSet1.Open;

    if  DataModule1.ClientDataSet1.IsEmpty  then
      begin
        Edit2.Text  :=  'NO DATA';
      end
    else
      begin
        Edit2.Text  :=  DataModule1.ClientDataSet1.Fields[1].AsString;
      end;
  finally
    Server.Free;
    DataModule1.SQLConnection1.Close;
  end;
end;
<!--CodeE-->

클라이언트에서 직접 서버쪽으로 쿼리를 날릴때 코드 (정상적으로 데이터 검색)
<!--CodeS-->
procedure TClientForm.Button2Click(Sender: TObject);
var
  Server  : TServerMethods1Client;
  MAIN_SQL  : String;
begin
  MAIN_SQL  :=  '';
  MAIN_SQL  :=  MAIN_SQL  + #13 + 'SELECT ';
  MAIN_SQL  :=  MAIN_SQL  + #13 + '             ITM04_ENTCOD ';
  MAIN_SQL  :=  MAIN_SQL  + #13 + '       FROM  ';
  MAIN_SQL  :=  MAIN_SQL  + #13 + '             ITM04_CLAS4 ';
  MAIN_SQL  :=  MAIN_SQL  + #13 + '       WHERE ';
  MAIN_SQL  :=  MAIN_SQL  + #13 + Format( '     ITM04_ENTCOD  = ''%s''  ',  [ Edit1.Text  ] );

  DataModule1.SQLConnection1.Open;
  Server  :=  TServerMethods1Client.Create( DataModule1.SQLConnection1.DBXConnection  );

  try
    DataModule1.ClientDataSet1.CommandText := MAIN_SQL;
    DataModule1.ClientDataSet1.Open;

    if  DataModule1.ClientDataSet1.IsEmpty  then
      begin
        Edit2.Text  :=  'NO DATA';
      end
    else
      begin
        Edit2.Text  :=  DataModule1.ClientDataSet1.Fields[1].AsString;
      end;
  finally
    Server.Free;
    DataModule1.SQLConnection1.Close;
  end;
end;
<!--CodeE-->
2  COMMENTS
  • Profile
    cdrd 2010.11.05 07:51
    클라이언트쪽 코드에서
    DataModule1.ClientDataSet1.Close;
    Server.GetServerData( Edit1.Text );
    DataModule1.ClientDataSet1.Open;

    아래처럼 위치를 바꾸어서 하니 데이터가 이상없이 검색됩니다.
    Server.GetServerData( Edit1.Text );
    DataModule1.ClientDataSet1.Close;
    DataModule1.ClientDataSet1.Open;

    그러나 또 다른 문제점 발생

    프로그램을 실행해서 조회 버튼을 클릭하면 검색이 않되고,
    조회 버튼을 한번 더 클릭하면 검색이 됩니다.

    이런 경우는 어떻게 해결해야할지 난감합니다.
  • Profile
    cdrd 2010.11.05 20:49
    조회 버튼을 2번 눌러야 데이터가 보이는 문제 해결

    Server.GetServerData( Edit1.Text );
    DataModule1.ClientDataSet1.Close;
    DataModule1.ClientDataSet1.Open;
    DataModule1.ClientDataSet1.Refresh; <-- 추가된 부분
  • profile cdrd
    2010/11/05 01:05
  • Views2128
    Likes0
    Comments2
    Reports0
  • Tag List
  • 목록으로