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

[DocWiki 번역] TFDMemTable 질문과 답변


Recommended Posts

Docwiki에 있는 "TFDMemTable Questions"를 번역한 글: 번역일: 2022년 3월 29일)

위로 가기: FAQ (FireDAC)

TFDMemTable과 관련된 질문과 답변을 정리한 목록이다.

Q: TClientDataSet에서는 레코드를 추가, 삭제, 변경할 수 있고, 변경 사항을 TClientDataSet.Delta를 통해 처리할 수 있었다. TFDMemTable에서도 가능한가?

A: TFDMemTable에도 비슷한 기능이 있다. 하지만, 캐시된 업데이트 모델을 사용한다. CachedUpdates 프로퍼티가 True이면, MemTable은 해당 업데이트 로그 안에 변경을 기록한다.

데이터베이스로 변경을 전달(post)하려면, ApplyUpdates를 사용한다. 변경 로그를 병합하려면, CommitUpdates를 호출해야 한다.

자세한 설명과 기타 메소드를 알려주는 FireDAC 도움말 파일과 예제는 FireDAC\Samples\Comp Layer\TFDMemTable에 있다.
 

Q: 클라이언트 데이터셋에서 CloneCursor를 사용해왔다. TFDQuery에서는 어떻게 하면 되는가?

A: 아래 코드를 사용한다.

FDMemTable1.CloneCursor(FDQuery1, False, False);

 

Q: FDMemTable을 생성하고 채우는(populate) 방법은?

A:

1)인-메모리 데이터셋을 생성한다.

with FDMemTable1.FieldDefs do begin
  with AddFieldDef do begin
    Name := 'f1';
    DataType := ftInteger;
  end;
  with AddFieldDef do begin
    Name := 'f2';
    DataType := ftString;
    Size := 50;
  end;
end;

with FDMemTable1 do begin
  Open;
  Append;
  Fields[0].AsInteger := ...;
  Fields[1].AsString := ...;
  Post;
end;

2) 데이터를 추가하고, 조회/편집을 한다.

 

Q: 다른 데이터셋으로부터 (구조를 포함하여) TFDMemTable을 적재하는 가장 빠른 방법은?

A: TDataSet에서 TFDMemTable로 구조와 데이터를 복사하는 가장 간편한 방법은 CopyDataSet 메소드를 사용하는 것이다.

FDMemTable1.CopyDataSet(DataSet1, [coStructure, coRestart, coAppend]);

 

Q: FDQuery에 있는 모든 레코드를 FDMemTable로 복사하고 FDMemTable 안에서 레코드를 편집하는 방법은?

A: 아래를 참고하여 작업하면 된다.

// UniDirectional은 반드시 False로 지정한다.
FDQuery1.FetchOptions.Undirectional := False;

FDQuery1.Open;
FDQuery1.FetchAll;
FDMemTable1.Data := FDQuery1.Data;
FDMemTable1.First;

while not FDMemTable1.Eof do begin
  FDMemTable1.Edit;
  .......
  FDMemTable1.Post;
  FDMemTable1.Next;
end;

 

Q: ftGUID 파입은 영속 필드(persistent field)를 만들지 못한다. 필드 크기 에러가 나는데, 필드 크기 조정은 비활성화되어 있다. 무엇이 잘못되었는다?

A: 이 이슈가 해소되기 전까지는 런-타임, 즉 실행 중에 GUID 필드가 생성되도록 코드를 작성한다.


Q: 메모리 테이블을 사용하는 것이 유리한 상황이 언제인지 일반적인 규칙이 있는가?

A: FireDAC만 사용하고 있다면, FDMemTable은 데이터를 메모리에만 두려고 할 때에만 사용한다. 그 외에 특별한 경우들도 있다. 예를 들어, CSV 파일을 FDMemTable에 로딩하고 나서  CSV에서 가져온 데이터를 사용할 수 있도록 LocalSQL을 이용한다. 

기타 다른 작업이라면, TFDQuery / TFDStoredProc을 사용하면 된다. 이것들에도 클라이언트 측 기능이 TFDMemTable과 마찬가지로 거의 모드 들어있기 때문이다.

 

Q: TFDMemTable에서 대량 편집(추가, 변경, 삭제)을 할 때 성능을 최적화하는 방법은?

A: LogChanges, FetchOptions, ResourceOptions, UpdateOptions 프로퍼티를 아래와 같이 설정한다.

FDMemTable1.LogChanges := False;
FDMemTable1.FetchOptions.RecsMax := 300000;  // 예제 값
FDMemTable1.ResourceOptions.SilentMode := True;
FDMemTable1.UpdateOptions.LockMode := lmNone;
FDMemTable1.UpdateOptions.LockPoint := lpDeferred;
FDMemTable1.UpdateOptions.FetchGeneratorsPoint := gpImmediate;

그리고 나서 대량 편집 작업을  BeginBatch / EndBatch 메소드 호출 사이에 놓는다.

FDMemTable1.BeginBatch;
try
    for i := 1 to 1000 do begin
      FDMemTable1.Append;
      // ...
      FDMemTable1.Post;
    end;
finally
    FDMemTable1.EndBatch;
end;

 

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

  • Kori changed the title to [DocWiki 번역] TFDMemTable 질문과 답변

이 토의에 참여하세요

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

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

중요한 정보

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