본문 바로가기
Delphi Tip/데이터베이스

델파이 데이타베이스 기초 4

by MonoSoft 2023. 10. 6.
728x90
반응형

델파이 데이타베이스

728x90

 

 

데이타 베이스 관련 콤포넌트

 

Data Access Component 

데이타엑세스 콤포넌트는 물리적인 데이타베이스를 프로그램시

사용자가 쓸수 있도록 접근할수 있게 해주는 콤포넌트들로

TDataBase, TDataSource,TTable, TQuery, TBatchMove, TSession 등이 있다.

 

TTable

데이타베이스 테이블에 접근하기 위한 콤포넌트이다.

테이블에 접근하기 위해

TableName 프로퍼티에 테이블 이름,DatabaseName 프로퍼티에

Alias이름을 지정해 주어야 한다.

그리고 실제 사용하기 위해서는 Active를 True로 해주거나

TTable.Open 메서드를 사용하여 테이블을 활성화 시켜야 한다.

그리고, Filter 프로퍼티를 사용하여 테이블을 필터링 할수 있으며

Master and Detail관계를 사용하여 테이블을 서로 연결할 수도 있다.

 

Filtering : 예를 들어 학교 이름이 '부산대학교' 인사람만 보고 싶을때

Filter : SchoolName = '부산대학교'

Filtered : True

 

이렇게 두개의 프로퍼티를 설정하면 됩니다.

그리고 WildCard 문자도 사용할수 있습니다.

 

Filter : SchoolName = '부산*'

 

이런식으로 그리고 and, or 연산도 가능합니다.

 

SchoolName = '부산대학교' or '부경대학교'

Master and Detail 테이블 연결 : MasterSource를 적어주는 쪽이

Detail 테이블이 됩니다.

 

마스터 테이블이 연결된 DataSource를 MasterSource 프로퍼티에 쓰고

MasterFiled를 더블클릭하면 Field Link Designer 가 나옵니다.

 

거기 보면 Detail과 Master Field가 나오는데

여기서 Detail은 Master에 종속되기 때문에..

 

즉 마스터 테이블의 레코드가 바뀔 때마다 Detail 테이블에서 원하는

레코드를 찾아야 되기 때문에 Detail Field는 Index 가 되어 있어야 합니다.

 

(Primary 또는 Secondary ) Detail과 Master 필드를 설정한 다음

Add 버튼을 누르면 아래에 조인된 표시가 나옵니다.

그럼 확인 버튼을 누르고 마스터와 디테일 테이블을 오픈하면

마스터 테이블의 레코드가 변할때 마다 디테일 테이블의 레코드도 따라 움직입니다.

 

 

TTable 2 개와 TDataSource 2개

TDBGrid(Data Control 콤포넌트) 2개를 폼에 올려 놓고

 

Table1.Name : MasterTbl

Table2.Name : DetailTbl

DataSource1 : MasterSource

DataSource2 : DetailSource MasterTbl과 DetailTbl모두

DatabaseName을 DBDEMOS로한다.

MasterTbl.TableName : ORDERS.DB

DetailTbl.TableName : CUSTOMER.DB 설정

MasterSource.DataSet : MasterTbl

DetailSource.DataSet : DetailTbl 준비가 끝났으면

이제 마스터-디테일 테이블 연결을 할 차례다.

 

먼저 DetailTbl.MasterSource : MasterSource 로 설정하고

DetailTbl의 오브젝트 인스펙터에서 MasterField를

더블클릭하면 Field Link Desinger 창이 나오는데

여기서 Detail 부분에서 CustNo, Master 부분에서 똑같이

CustNo를 선택하고 Add 버튼을 누르고 확인을 한다.

 

그리고 DBGrid1.DataSource에 MasterSource를

DBGrid2.DataSource에 DetailSource를 입력하면 연결은 끝이다.

 

그리고 MasterTbl과 DetailTbl의 Active를 True로 하면

두 테이블이 연결되어 움직이는 것이 보일것이다.

 

ORDERS.DB는 고객의 주문에 관한 내용이고

CUSTOMER.DB는 고객에 관한 정보이다.

 

결국 실제 모습은 주문한 내용이 변하면

거기에 딸린 고객의 정보가 바로 나온다.

 

즉 주문한 내용의 고객에 관한 내용이

단 한줄의 소스 코딩도없이 바로 볼수 있는 것이다.

 

TTable에는 또 중요한 속성이 하나 더 있다.

 

그것은 다로 TField속성이다.

이것은 테이블의 필드에 접근할수 있도록 해주는 클래스입니다.

 

폼위에 TTable을 하나 얹어 두고 더블 클릭을 하면

아무 내용도 없는 조그만 Field Editor라는 창이 생긴다.

 

이것을 사용해서 사용자정의 계산 필드를 만든다 던지

룩업 필드를 만들수 있습니다.

 

 

Table에서 데이타 읽기

이제 까지 테이블을 실제 DB와 연결하고 테이블 끼리

연결하는걸 간단하게 나마 보았다.

 

그럼 실제 테이블의 데이타를 프로그램 내부에서 쓰고

싶을때는 어떻게 하는가?

 

이때는 TTable.Fields라는 프로퍼티를 이용한다.

헬프를 보면 알겠지만 Fields라는 프로퍼티는

 

property Fields[Index: Integer]: TField;

 

이렇게 구성되어 있습니다 그리고, 이건 Table의 디폴트 프로퍼티 입니다.

그럼 실제로는 어떻게 사용하느냐 하면 폼에 TTable을 하나 놓고

Name 을 CustTable로 바꿉니다.

 

그러고 나서 DatabaseName에 DBDEMOS를 넣고,

TabbleName 을 Customer.DB로넣어 줍니다.

 

그리고 Active 를 True로 해줍니다.

이렇게 해줘야 아래 문장을 쓸수 가 있습니다.

 

Active 를 True로 하는 거하고

Table을 Open시키는 거하고는 같은 일입니다.

 

이렇게 함으로써 물리적인 Customer.db화일이

프로그램상의 테이블 콤포넌트와 연결이 됩니다.

 

그럼 Customer.db의 7번째 필드의 값을 알고 싶다면

 

Edit1.Text := CustTable[6].AsString;

^번호가 0부터 시작하므로 7번째는 6이다.

 

Edit1.Text := CustTable.Fields[6].AsString ;

이런식으로 사용합니다. 둘다 똑같은 일을 합니다.

 

위처럼 Fields 를 쓰지 않고 Table에다바로

CustTable[6] 이런식으로 해도 되는 이유가 바로

Fields프로퍼티가 디폴트 프로퍼티이기 때문입니다.

 

그럼 이 놈은 어느 레코드의 값을 돌려 주느냐 하면

현재 레코드의 값을 돌려 줍니다.

 

Open한 바로 다음이라면 보통 첫번째 레코드를 돌려 주죠.

 

현재 레코드란 테이블의 모든 레코드를 한번에 접근할수는 없습니다.

한순간에 단 한개의 레코드에만 접근할수 있죠..

 

그게 바로 현재 레코드입니다.

눈에 보이긴 여러개 보이더라고 그중 우리가 수정하거나,

지우거나 할수 있는건 단 하나의 레코드,

바로 현재 레코드 뿐인 것입니다.

 

그래서 현재 레코드라는 말을 쓰는 겁니다.

아마 앞으로 자주 이말이 등장할것입니다.

 

즉 수많은 레코드들이 있는데 그걸 프로그램에서 할려면

마치 배열 처럼 써야 되는데 그렇게 하지 않고 쓸수 있는

이유가 바로 한순간엔 하나의 레코드 밖에 처리 할수 없기 때문입니다.

 

그럼 뒤에 있는 AsString이란 뭐냐?

 

대충 눈치 챘겠지만 이건 필드의 값을 String type 으로 넘겨 줍니다.

이렇게 넘겨 줄려면 당연히 필드의 DataType도

문자형(paradox의 경우 Alpha타입)이어야 합니다.

 

정수형필드에 AsString을 쓰면 당연히 에러가 납니다.

 

그럼 필드의 DataType하고 델파이의 데이타 타입은 다른가?

예!! 다릅니다. 왜냐면 C의 데이타 형이 다르고 파스칼의

데이타 형이 다르듯이 테이블도 테이블을 만들때 정의하는 Driver에 따라

서로 다른 형의 타입을 가집니다.

728x90
반응형

댓글