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

[DocWiki 번역] 테이블 조회하기 (FireDAC)


Recommended Posts

Docwiki에 있는 "Browsing Tables (FireDAC)"를 번역한 글: 번역일: 2022년 3월 29일)

위로 가기: [DocWiki 번역] 명령(command)을 가지고 작업하기 (FireDAC)

목차


1 TFDTable 사용하기 (Using TFDTable)

TFDTable 컴포넌트를 사용하면, 데이터베이스 테이블 둘러보기, 레코드 정렬/필터링, 데이터 편집 등을 할 수 있다. TFDTable은 TFDTable의 프로퍼티 값과 호출되는 메소드를 기반으로 투명하게 SELECT 명령문을 생성하여 DBMS로 보낸다.

TFDTable의 주요 동작 모드는 2가지이다.

  • 라이브 데이터 창(Live Data Window) 모드: 메모리 사용을 최소화하면서 양방향으로 대용량 데이터를 조회(browse)할 수 있다.
  • 표준(Standard) 모드: TFDQuery와 비슷한 모드이다. TFDTable은 단일 SELECT 명령을 생성하고 그 결과 세트를 사용하여 테이블 레코드를 조회(browse)한다.

테이블을 오픈(open)하려면, TableName 프로퍼티가 반드시 명시되어야 한다. 또한, IndexFieldNames 또는 IndexName 프로퍼티를 지정할 수도 있다.

주의: IndexName 프로퍼티를 사용하려면, fiMetaFetchOptions.Items에 들어있어야 한다. 예를 들면,

FDTable1.TableName := 'CUSTOMERS';
FDTable1.IndexFieldNames := 'CustNo';
FDTable1.Open;

TFDTable에서 필드 이름을 강제로 괄호로 감싸려면, FormatOptions.QuoteIdentifiersTrue로 지정한다.

 

1.1 TFDTable을 TClientDataSet 및 TDataSetProvider과 함께 사용할 때 알아둘 점 (Notes on the Use of TFDTable with TClientDataSet and TDataSetProvider)

TFDTableTClientDataSetTDataSetProvider(데이터스냅)과 함께 사용할 때에는, TFDTable은 변경이 있을 때마다 데이터셋 전체를 다시 오픈(open)한다. 이 이슈를 피해 가려면, 다음 중 한가지 조치를 한다.

 

2 라이브 데이터 창 모드 (Live Data Window Mode)

라이브 데이터 창(LDW) 모드에서, FireDAC은 "FetchOptions.RowsetSize의 갯수 x 2" 개의 레코드만 쿼리하여 메모리에 유지한다. 이것이
해당 테이블의 데이터로 가는 창이 된다. 애플리케이션에서 테이블 데이터를 탐색(navigate)하면, FireDAC은 자동으로 스크롤하거나 또는 LDW를 필요한 위치에 둔다. 이 모드는 다음과 같은 장점이 있다.

  • 메모리 사용을 최소화하고, 단방향(unidirectional) 데이터셋과 마찬가지로, 대용량 데이터에서 작업할 수 있다. 
  • 단방향(unidirectional) 데이터셋과 달리, 양방향 탐색이 가능하다.
  • 항상 신선한 데이터를 제공하면서도 데이터셋 새로고침이 필요한 횟수가 줄어든다.
  • 정렬하기, 레코드 위치로 이동하기, 마지막 레코드로 건너가기 등등을 수행할 때 결과 세트 데이터 전체가 필요하지만, 담아오기는 동작이 지연되지 않는다.

Filter 프로퍼티, 범위 필터링, IndexFieldNamesIndexName 프로퍼티, LocateLookup 메소드, 키 위치 찾기, RecNo 설정, 북마크 설정 등등은 추가 SELECT 명령에 의해 수행되거나 또는 메인 SELECT 명령에 구문을 추가하여 수행된다. Filter, IndexFieldNames, IndexName을 변경하게 되면, 데이터셋 안의 현 위치 역시 바뀐다. 현 위치를 보존하려면, 변경 발생 전에 북마크를 저장하고, 변경 후에 다시 그 위치로 복원한다.

LDW 모드에서, Filter 프로퍼티 값은 있는 그대로 WHERE 구문에 반영된다. 해당 표현식이 DMBS 또는 로컬 표현식 엔진(local expression engine)과 호환되도록 하려면, 애플리케이션은  FireDAC의 escape sequence를 사용한다. 예를 들면,

FDTable1.Filter := 'DateField = {d ' + FormatDateTime('yyy-mm-dd', Trunc(MonthCalendar1.Date)) + '}';
FDTable1.Filtered := True;

설계 상, LDW 모드는 항상 ORDER BY 구문을 SELECT 명령에 적용한다. LDW가 올바르게 작동하기 위해 충족되어야 하는 주요 요구 사항은 다음과 같다.

  • 테이블에 고유키 또는 PK(프라이머리 키)RK 항상 적용되어야 한다. 자세한 내용은 [DocWiki 번역] 고유 식별 필드 (FireDAC) 참고.
  • 서버 측 데이터 정렬과 클라이언트 측 데이터 정렬은 동일해야 한다. 그렇지 않은 경우, TFDTable은 행(row)을 중복해서 만들어 낼 수 있고 "unique key violation" 에러를 일으킬 수 있다.

FireDAC은 LDW 모드에서 SQL 명령을 생성하고 실행하는 횟수를 최소화하지만 DB에 주는 부하는 여전히 TFDQuery보다 더 많다. 따라서 애플리케이션 개발자는 TFDTable과 LDW 모드를 언제 사용할 것인지 신중하게 선택해야 한다.

 

3 LDW 모드 설정하기 (Setting the LDW Mode)

LDW 모드를 사용하려면, 다음 조건을 모두 충족해야 한다.

그렇지 않으면, 표준 모드가 사용된다.

이 모드는 TFDTable이 비활성화 상태일 때만 바꿀 수 있다. 그 결과, 테이블이 비활성화된 경우에만 CachedUpdates를 변경할 수 있다. 또한 FetchOptions.LiveWindowParanoic(기본값은 False) 및 FetchOptions.LiveWindowFastFirst(기본값은 False)를 변경함으로써, 성능을 개선할 수 있다.

 

4 "Unique Key Violation" 에러가 LDW 모드에서 발생하지 않도록 방지하기 (Avoiding "Unique Key Violation" Error in LDW Mode)

데이터베이스 정렬 순서를 클라이언트 측 정렬 순서와 동일하게 만들려면, FormatOptions.SortLocaleFormatOptions.SortOptions를 사용하여 클라이언트 측 정렬 순서를 조정할 수 있다. 예를 들어, 독일어를 사용하는 개발자는 독일어 문자열 데이터가 포함된 ISO8859_1 문자셋으로 Firebird 데이터베이스를 쿼리하도록 TFDTable을 설정할 수 있다.
 

uses
  Windows;
...
// locale ID를 독일어 전화번호부 데이터 정렬로 지정한다
FDTable1.FormatOptions.SortLocale := MAKELCID(MAKELANGID (LANG_GERMAN, SUBLANG_GERMAN), SORT_DEFAULT);
// 구두점과 기타 기호를 정렬에 반영하지 않도록 지정한다
FDTable1.FormatOptions.SortOptions := [soNoSymbols];
FDTable1.IndexFieldNames := 'NAME';
FDTable1.TableName := 'CUSTOMERS';
FDTable1.Open;

DBMS에 따라 다음과 같이 추가 설정을 할 수 있다.

DBMS 설정
Firebird SortOptions에 soNoSymbols를 포함해야 할 수 있다.
MySQL SortOptions에 soNoSymbols를 포함해야 할 수 있다.
Oracle ALTER SESSION SET NLS_COMP=ANSI 실행이 필요할 수 있다.
SQLite SortLocale을 0으로 지정

예를 들어, Oracle 개발자는 아래 명령(command)를 수행한다.

FDConnection1.Connected := True;
FDConnection1.ExecSQL('ALTER SESSION SET NLS_COMP=ANSI');

또한, FormatOptions.StrsTrimFalse로 지정할 것을 권장한다.

주의: 개발자가 클라이언트 측 정렬 조정에 실패하면, LDW 모드가 비활성화되도록 FetchOptions.CursorKindckDefault, ckStatic, ckForwardOnly 중 하나로 지정한다.

 

5 기타 자료 (See Also)

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

이 토의에 참여하세요

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

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

중요한 정보

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