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

[DocWiki 번역] 가져오기 및 채우기 관련 질문과 답변 (FireDAC)


Recommended Posts

Docwiki에 있는 "Fetching and Populating Questions (FireDAC)"을 번역한 글: 번역일: 2022년 4월 18일

위로 가기: [DocWiki 번역] FAQ (FireDAC)

 

레코드(record) 가져오기 및 데이터셋(dataset) 채우기 관련 질문과 답변을 정리한 목록이다.

 

Q1: FireDAC에서 결과 데이터셋(dataset)에 앞으로 이동-전용(forward-only), 읽기-전용(read-only)을 통한 빠른 접근을 할 수 있는가?

A: FDQuery.FetchOptions를 설정하라:

  • CursorKind = ckDefault 또는 ckForwardOnly
  • Mode = fmOnDemand
  • RowsetSize = 1000
  • Unidirectional = True
  • 원한다면, fiMeta를 Items 에서 빼낸다. 단, 당신이 데이터셋(dataset)을 편집할 필요가 없을 때만.

 

Q2: FDQuery 하나 또는 FDMemTable 하나에 결과 세트(result set) 여러개를 붙여 넣는 방법은?

A: 클라이언트 데이터셋(client dataset)을 사용하려 결과 세트 여러 개를 유지하는 방법이 있다: 

  begin loop
    // 새 params를 사용하는 SqlQuery를 실행한다
    ...
    ClientDataset.AppendData(SqlQuery.Data)
    ...
  end loop

아마 단일 TFDQuery로 교체할 수도 있다. 예를 들면: 

  // 최초로 열기(open)와 가져오기(fetch)
  FDQuery1.Params[0].AsInteger := 1;
  FDQuery1.Open;

  // 명령(command)을 다시 실행, 행(row)을 다시 가져온 후 기존 행(row) 뒤에 덛붙이기
  FDQuery1.Command.Close;
  FDQuery1.Params[0].AsInteger := 2;
  FDQuery1.Command.Open;
  FDQuery1.FetchAgain;
  FDQuery1.FetchAll;

  // 다른 파라미터 값을 사용하여 계속해서 명령(command)을 다시 실행
  FDQuery1.Command.Close;
  FDQuery1.Params[0].AsInteger := 3;
  FDQuery1.Command.Open;
  FDQuery1.FetchAgain;
  FDQuery1.FetchAll;

 

Q3: 쿼리 하나를 실행하여 가져온 결과 세트를 기존 데이터셋에 덛붙일 때 가져온 레코드를을 삽입하지 않고 수행할 수 있는 방법은?

A: TFDDataSet.FetchAgain 메소드의 설명을 참고하라. 그 외에도 대안으로, SQL 명령(command)을 실행하여 추가 레코드를 가져와서 기존 데이터셋에 담아 넣을 수 있다.: 

FDCommand1.CommandText := 'select ... from ... where id= :id';
FDCommand1.Open;
FDCommand1.Fetch(ADQuery1.Table);
FDCommand1.Close;

 

Q4: 내 쿼리는 레코드를 800개 반환하는데, RecordCount는 50을 반환한다. 뭐가 잘못되었나?

A: 기본 설정에서는, RecordCount는 데이터셋(dataset)의 레코드 캐시(cache)에 있는 레코드 갯수를 보여준다. 레코드 카운팅 모드에 대한 더 자세한 내용은 FetchOptions.RecordCountMode 프로퍼티를 참고하라.

50은 기본 설정된 rowset의 크기이다. 이 숫자는 FireDAC이 한번 요청할 때 가져오는 갯수이다. 따라서 오픈(open)을 한 직후에, 데이터셋의 레코드는 the dataset  <= 50 이다. 그 숫자를 RecordCount에서 제공한다. 데이터셋(dataset) 안에 있는 레코드 사이를 옮겨 다닐 때, FireDAC은 추가로 rowset을 더 가져오게 되고 그 결과 레코드 갯수가 증가하게 된다.

쿼리가 반환하는 레코드 총 갯수를 제시하려면, 다음 중 하나를 수행하라:

  • ADQuery1.FetchAll을 수행한다. 그 결과, 모든 데이터를 가져오게 되고, RecordCount는 전체 갯수를 제시한다;
  • FetchOptions.RecordCountMode를 cmTotal로 지정한다. 주의 할 점은 이 경우 성능 저하를 유발할 수 있다. 그 이유는 각 SELECT 쿼리 마다 FireDAC이 추가로 SELECT COUNT(*) 쿼리를 실행하기 때문이다.

 

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

이 토의에 참여하세요

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

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...

중요한 정보

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