Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr

[demo] FireDAC FetchOptions을 사용한 쿼리 레코드 카운트 제어 및 RecordCount 이해.


Recommended Posts

FireDAC의 FetchOptions 을 사용하여 쿼리로 가져올 레코드 데이터 수 제한하는 방법을  쿼리문 으로  실행 하는 방법과 비교해 봅니다.

image.png

 

사용할 FetchOptions에 대한 정의는 아래 게시글을 참조 하시면 도움이 됩니다.

아울러 FireDAC RecordCount 에 대하여 정확하게 이해 하도록 합니다.

 

데모 프로젝트는 FireDAC, FDQuery, DataSource를 사용하여 DBGrid 에 바로 데이터를 로딩 합니다.

image.png

 

*첫번째는 RecsSkip 과 RecsMax 로 쿼리 레코드 수를 제어 하는 방법입니다.

샘플 소스와 같이 데이터를 직접 입력 하면 됩니다.

FDQuery1.FetchOptions.RecsSkip := StrtoInt( ET_Top.Text );
FDQuery1.FetchOptions.RecsMax  := StrtoInt( ET_Limit.Text );

procedure TMFForm.Button1Click(Sender: TObject);
begin
  FDQuery1.Close;
  FDQuery1.SQL.Clear;
  FDQuery1.SQL.Text := 'Select * from testdb';
  FDQuery1.FetchOptions.RecsSkip := StrtoInt( ET_Top.Text );
  FDQuery1.FetchOptions.RecsMax  := StrtoInt( ET_Limit.Text );

  FDQuery1.FetchOptions.Mode :=  fmAll;  // 전체 카운트 확인용
  FDQuery1.Active := TRUE;

  Label3.Caption := 'Total Record Count = ' + FDQuery1.RecordCount.ToString;
end;

 

* 두번째는 쿼리문으로 직접 레코드 카운트수를 제어 하는 방법입니다.

이 경우에는 데이터베이스 종류에 따라 SQL문의 형태가 다를 수 있습니다.

쿼리문을 사용 할 때는 FetchOptions.RecsSkip 과 FetchOptions.RecsMax 값에 기본값 -1 이 아닌 다른 값이 할당 되면 오류가 납니다.

이 프로젝트 같은 경우 Button1  메소드에서  할당된 값이 있으므로 Button2 메소드에서 초기화 하였습니다.

따라서 이 속성을 전혀 사용하지 않는 다면 별도 초기화는 필요 없습니다.

procedure TMFForm.Button2Click(Sender: TObject);
begin
  FDQuery1.Close;
  FDQuery1.SQL.Clear;

  FDQuery1.FetchOptions.RecsSkip := -1;   // 쿼리문 안에서 Limit 사용시는 미사용으로 초기화 헤야 함.
  FDQuery1.FetchOptions.RecsMax  := -1;

  FDQuery1.SQL.Add( 'select * from testdb Limit :p_Top, :p_Count ' );
  FDQuery1.ParamByName('p_Top').Asinteger   := StrtoInt( ET_Top.Text );
  FDQuery1.ParamByName('p_count').Asinteger := StrtoInt( ET_Limit.Text );

  FDQuery1.FetchOptions.RowsetSize := StrtoInt( ComboBox1.Text );
  FDQuery1.FetchOptions.Mode := fmOnDemand;  //  화면 표시 레코드 수  지정
  FDQuery1.Active := TRUE;

  Label3.Caption := 'Memory Record Count = ' +  FDQuery1.RecordCount.ToString;
end;

 

* 다음은 FDQuery1.RecordCount 에 관한 설명입니다.

기본 옵션 변경 없이  RecordCount 값을 쿼리 한 전체 레코드 수로 사용하면 잘 못 사용한 경우가 됩니다.

FDQuery1.RecordCount의 범위는 FetchOptions.RowsetSize 로  50으로 지정 되어 있는데 이것은 DBGrid 같은 방식으로 화면에 데이터를 로딩 할 때  DBGrid 화면 메모리에 한번에 올리는 카운터 수 이며  전체 쿼리수는 아닙니다.
따라서 쿼리된 레코드수가 50 이상으로 초과하는 경우에도 항상 50으로 나오게 됩니다.

만약  전체쿼리수를 RecordCount 로 표현 하고 싶으면 FDQuery1.FetchOptions.Mode :=  fmAll; 로 지정 하면 됩니다.
단, 이때는 화면 메모리에 전체 데이터를 모두 삽입 하므로 로딩 시간이 길어 집니다.
50 같이 특정 수로 제한 하였을 경우에는 사용자가 화면 스크롤 싯점에 나머지 레코드 데이터들이  화면에 반영 됩니다.
만약 화면에 표시할 수 있는 카운트 수가 지정된 수보다 클 경우는 지정된 수를 무시하고 화면에 표시될 수 있는 최대치를 표시 합니다.

따라서 RecordCount를  쿼리 카운트 읽는 용도로의 사용은 데이터수 가 적어 화면 로딩에 별 문제가 없을 경우에  사용 하면 됩니다.

image.png

 

데모 동영상

 

이 댓글 링크
다른 사이트에 공유하기

  • c2design changed the title to [demo] FireDAC FetchOptions을 사용한 쿼리 레코드 카운트 제어 및 RecordCount 이해.

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 토픽(기고/질문)에 답하기

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.