본문 바로가기

데이터 엑세스

FireDAC 자동증가필드 적용 및 갱신

대부분 DBMS는 테이블에 자동증가필드를 설정할 수 있습니다.

자동증가필드는 테이블에 새로운 데이터 입력 시 필드의 값을 자동으로 증가해 유효한 값을 갖도록 하는 것이 목적입니다.

 

자동증가필드 설정은, 

SQLServer(MSSQL)은 필드에 IDENTITY 속성을 설정, MySQL은 필드에 auto_increment 속성을 설정해 지원합니다.

오라클과 인터베이스는 필드의 속성을 설정하는 방식을 지원하지 않습니다.

오라클은 Sequence, 인터베이스(그리고 Firebird)는 Generator 생성 후 트리거(Before Insert)와 연동해 자동증가 필드를 적용할 수 있습니다.

이 글에서는, 인터베이스 테이블의 자동증가필드를 설정하고, 테이블에 데이터 추가 후 갱신된 자동증가필드 값을 가져오는 방법을 설명 합니다.

 

다음 코드는 새로운 데이터 추가 후 자동증가필드 값을 가져오는 코드입니다.

코드를 실행하면 2가지 문제를 만나게 됩니다.

procedure TForm1.Button3Click(Sender: TObject);
begin
  FDQuery1.Append;
  FDQuery1.FieldByName('BOOK_TITLE').AsString := 'test';
  FDQuery1.FieldByName('BOOK_AUTHOR').AsString := 'test';
  FDQUery1.Post;

  ShowMessage(IntToStr(FDQuery1.FieldByName('BOOK_SEQ').AsInteger));
end;

 

코드를 실행하면 먼저 다음과 같은 오류를 만나게 됩니다.

BOOK_SEQ 필드는 자동증가필드로, 필드에 값이 없다는 오류입니다. 자동증가필드는 자동으로 값이 채워지도록 설정해야 합니다.

FireDAC 데이터셋 컴포넌트(TFDQuery, TFDTable, TFDStoredProc)에 자동증가필드를 설정하면 해결할 수 있습니다.

  • UpdateOptions > AutoIncFields

자동증가필드 설정 시 새로운 레코드 추가 시 해당 필드에 임의의 음수 값이 자동 설정됩니다.(-1 > -2 > -3 > ...)

 

 

그리고, 다시 실행하면 다음과 같이 음수 값이 표시됩니다. 즉, 자동증가필드값이 갱신되지 않습니다.

인터베이스의 경우 제너레이터로 자동증가필드가 채워져 제너레이터이름을 지정하면, 자동증가필드 값이 갱신됩니다.

  • UpdateOptions > GeneratorName

참고로,

오라클도 시퀀스를 지정해 같은 동작을 할 수 있을 것으로 생각됩니다. 하지만 개발환경이 되지 않아 테스트 해보지 못했습니다.

(오라클 환경이 되시는 분이 계시면 테스트 후 결과 알려주시면 감사하겠습니다.)

 

MySQL, SQLServer 등 자동증가필드를 필드 속성으로 지정하는 경우 위 작업을 별도로 진행하지 않아도 자동 갱신됩니다.