델파이 파이어댁 메모리 테이블 tFDMemTable
메모리 테이블
데이터베이스 서버를 써야 할 정도로 데이터의 크기가 크지 않다면 메모리 테이블이 좋은 대안이다. 그러나 메모리 테이블을 이용하는 건 서버를 이용하는 거보다 편할 뿐 성능은 다른 문제다. 이름 그대로 데이터를 메모리에서만 이용하고 마는 경우는 드물고 메모리 테이블을 이용해도 파일로 저장하고 읽고를 하게 마련이다. 이 부분에서 메모리 테이블을 이용하는 것과 데이터베이스 서버를 이용하는 것에 원칙적인 차이는 없다. 그러나 메모리 테이블은 주로 프로그래밍 언어 차원에서 제공되므로 전문적인 dbmsdatabase management system를 이용하는 거보다 성능은 떨어진다. .네트의 DataTable은 성능이 나쁘기로 유명하여 테이블 형태의 데이터 제어가 필요할 때에도 굳이 클래스를 리스트에 담아서 루프를 돌려 가며 쓰기도 한다. 그러나 델파이에 기본적으로 제공되는 fireDAC의 tFDMemTable은 다르다. 파이어댁 자체가 그 성능을 인정받는 dbms다. 물론 메모리 테이블들을 여럿 합친 3차원 형태의 데이터세트 또는 데이터베이스의 형태로도 이용할 수 있다.
tFDMemTable
델파이에는 데이터베이스 라이브러리로 파이어댁 말고도 DataSnap이라는 게 있다. 이건 파이어댁보다 오래된 거고 더 안정적인 대신 기능들이 다양하지는 않다. 데이터스냅에는 tClientDataSet이라는 메모리 테이블이 있지만 요샌 주로 파이어댁을 쓴다. tFDMemTable에 sql을 쓸 수도 있다. .네트의 DataSet와 달리 tFDMemTable은 필드를 일단 만들고 나면 그 이름을 바꿀 수 없기 때문에 주의하는 게 좋다. DataSet는 xml로만 저장을 할 수 있어서 파일 입출력이 느리고 만들어지는 파일의 크기도 큰 데 반해 tFDMemTable은 바이너리 파일로 읽고 쓰므로 빠르고 만들어지는 파일의 크기도 작다.
필드는 디자인-타임과 런-타임 모두에서 만들 수 있는데 당연히 전자가 더 편하다. tFDMemTable 아이콘이나 스트럭처 창을 통해 팝업 메뉴를 열고 이용하면 된다. 이렇게 필드를 만들고 tFDMemTable을 액티브로 하면 FieldDef는 자동으로 만들어진다. 아래는 런-타임 코드다.
type
TForm1 = class(TForm)
FDMemTable1: TFDMemTable;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
procedure FormCreate(Sender: TObject);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
fieldDef: TFieldDef;
begin
DataSource1.DataSet := FDMemTable1; // use object inspector
DBGrid1.DataSource := DataSource1; // use object inspector
fieldDef := FDMemTable1.FieldDefs.AddFieldDef;
fieldDef.Name := 'field1';
fieldDef.DataType := ftInteger;
fieldDef := FDMemTable1.FieldDefs.AddFieldDef;
fieldDef.Name :='field2';
fieldDef.DataType := ftString;
fieldDef.Size := 10;
FDMemTable1.CreateDataSet;
end;
아래와 같이 하는 게 더 편하지만 권장되는 방법은 아니다. add의 코드를 보면 AddFieldDef를 이용하고 있기 때문이다.
FDMemTable1.FieldDefs.Add('NAME', ftString, 100, True);
변수를 선언하지 않고 하려면 아래와 같이 한다.
procedure TForm1.FormCreate(Sender: TObject);
begin
with FDMemTable1.FieldDefs.AddFieldDef do
begin
Name := 'NAME';
DataType := ftString;
Size := 100;
Required := True;
end;
with FDMemTable1.FieldDefs.AddFieldDef do
begin
Name := 'MARKET CODE';
DataType := ftString;
Size := 6;
Required := True;
end;
FDMemTable1.CreateDataSet;
end;
오브젝트 인스펙터로도 쉽게 설정할 수 있다. 테이블을 만든 뒤 파일로 저장하면 디자인-타임에 파일을 불러와 쿼리 작업을 할 수도 있다.