Notice
Recent Posts
Recent Comments
Link
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

끄적끄적IT공부방

델파이 - DataBase 관련 컴포넌트 본문

델파이

델파이 - DataBase 관련 컴포넌트

도비네이션 2018. 11. 5. 15:29

1. DataBase 관련 컴포넌트
Database 관련 컴포넌트는 크게 데이타를 액세스하는 Non-Visual Data-Access 컴포넌트와 데이타를 표시하고 편집하게 하는 Data-aware Visual Controls가 있습니다. 

Database 관련 프로그램을 작성하기 위해 Table, Query 등의 DataSet 컴포넌트와 DataSource컴포넌트 및 각 DB Control 컴포넌트들이 필요한데, 각 컴포넌트가 연결되는 방식은 아래 그림과 같습니다.


DataSet컴포넌트(TTable,TQuery,TStored Procedure ...)로 데이타를 연결하고 그것을 다시 DataSource컴포넌트로 연결하고 다시 Control Component(Data Controls팔레트에 있는 컴포넌트들)와 연결하면 아주 쉽게 데이타를 화면에서 볼 수 있습니다.
▶ DataSet 컴포넌트
델파이에서 DataSet은 필드번호와 현재 레코드의 포인터를 포함하는 일련의 레코드로 구성된 것을 말합니다. DataSet은 Table컴포넌트와 같이 실제적인 테이블과 직접적인 관계를 갖거나 Query컴포넌트와 같이 조회의 결과로서 얻어진 테이블의 일부가 될 수도 있고 여러 테이블의 내용을 포함할 수 있습니다.
▶ DataSource컴포넌트
DataSource컴포넌트에는 DataSet이라는 속성이 있는데, 이 속성을 변경하여 DataSource와 연결된 DB Control컴포넌트에서 데이타를 쉽게 변경할 수 있습니다.
만약 DataSource컴포넌트가 없이 DataSet컴포넌트와 DB Control컴포넌트가 직접 연결된다면 데이타의 수정이 조금 번거롭게 될 것예요. 여러 DBEdit컴포넌트와 연결된 DataSet컴포넌트를 다른 DataSet컴포넌트로 바꾸려고 한다면 일일이 DBEdit컴포넌트의 DataSet속성을 바꿔줘야 할테니까요.
(이것은 DataSource컴포넌트가 없다는 가정하에서 나오는 얘기이므로 실제 DBEdit컴포넌트에는 DataSet속성이 없음을 알려드립니다.)
물론 여러 DBEdit컴포넌트를 한꺼번에 묶어서 속성을 바꿔주는 방법이 있을 수도 있겠지만, 저처럼 머리가 나쁘면 한 두개씩 꼭 빼먹거든요.
DataSource컴포넌트가 있기때문에, 우리는 여러 DBEdit컴포넌트를 DataSource와 연결시킨 후, DataSet컴포넌트를 바꾸려고 할 때 손쉽게 DataSource의 DataSet속성만 수정하면 되는 것이죠.
▶ DBControls컴포넌트
DBControls는 데이타를 입력하고 보기 위한 사용자 인터페이스를 제공합니다. 위에서 DataSource를 사용해야 하는 점을 분명히 밝혔습니다. 당연히 DBControls컴포넌트에 기본적으로 설정해야 하는 속성은 DataSource속성입니다.
이제 이론적인 부분은 다 배웠는데요. 실제 사용해보면 설명이 너무 길었음을 알 수 있을 거예요. 실습은 너무 간단하거든요. (^.^)
먼저 Table컴포넌트에 대해서 알아볼까요?
Table컴포넌트는 위에서 얘기한 대로 DataSet컴포넌트의 하나입니다. DataSet은 Open을 수행하여야 이용 가능하며 Close하면 더 이상 이용할 수 없습니다.
Table의 DatabaseName과 TableName속성을 지정한 후, 아래와 같이 하십시오.

Table1.Open; ... Table1.Close;

Table1.Open이라는 문장을 실행하면 우리는 Table컴포넌트에 연결된 실제 테이블의 내용을 볼 수 있을 거예요.(아직은 DataSource와 DBControl컴포넌트를 만들지 않았으므로 보이지 않겠죠. )
디자인시에 테이블을 Open하고 싶다면 Active속성을 True로 바꿔주면 됩니다.
또한 다음과 같이 코딩해 줘도 되구요.

Table1.Active := True; ... Table1.Active := False;

Query의 Open은 질의 문장(SQL)이 있기 때문에 Table과 비슷하지만 약간은 다르죠.
Query는 Table과 마찬가지로 DatabaseName속성을 먼저 정해주고 SQL속성을 정해줍니다. 이 곳에는 원하는 SQL문을 넣을 수 있습니다. 그 다음에 Table처럼 Active 속성을 True로 바꿔주면 데이타가 연결됩니다. 물론 질의에 의해 실행된 데이타가 연결될 겁니다.
그리고, 런타임시에 코딩으로 수행할 수도 있습니다.

Query1.Open; ... Query1.Close;

대신 Select와 같은 SQL문은 Open메소드나 Active속성만으로도 SQL문을 실행할 수 있지만 Insert/Update/Delete문은 ExecuteSQL메소드를 사용합니다.
이 밖에도 Query컴포넌트의 여러 속성이 있지만, 잠시 후에 자세하게 배워보도록 하고 다음 내용을 살펴보시죠.
▶ DataSet의 State 관계


DataSet이 어떤 작업을 수행할 수 있는 상태인가에 따라서 DataSet의 State속성은 결정됩니다. 이 속성은 아주 유용하게 사용될 수 있습니다.
▶ State 속성값

Value

상 태

설 명

DsInActive

InActive

DataSet이 Close되어 있는 상태

DsBrowse

Browse

DataSet이 Open되어 있고 데이타가 바뀌지 않고 보여지는 상태이며 Open시의 기본상태

DsEdit

Edit

DataSet이 Open 되어 있고 현재의 레코드가 수정된 상태, 즉 DataSet.Edit가 수행되어 있는 상태

DsInsert

Insert

DataSet이 Open되어 있고 새로운 레코드가 Insert나 Append되어 있는 상태

DsSetKey

SetKey

DataSet이 Open되어 있고 GotoKey로 해당 레코드를 찾아갈 수 있는 상태(TTable과 TclientDataSet에서만 가능)

다음은 State를 사용하여 Table을 닫기전에 바뀐 내용을 저장할 것인지 묻는 예제입니다.
Table을 닫기 전에 실행되야 하므로 BeforeClose 이벤트에 사용되었네요.

Procedure TForm1.Table1BeforeClose(DataSet: TDataSet); Begin If (Table1.State = dsEdit) or (Table1.State = dsInsert) then Begin If MessageDlg('닫기 전에 바뀐 내용을 저장하시겠습니까?', mtConfirmation,[mbOk,mbCancel],0) = mrOK then Table1.PostElse Table1.Cancel; End; End;

그 다음으로 DataSet에서 알아둘 내용은 DataSet의 내용을 Navigate할수 있는 메소드와 속성들입니다.
First  DataSet의 제일 첫 레코드로 이동
Last  DataSet의 제일 마지막 레코드로 이동
Prior  현재 레코드보다 하나 앞의 레코드로 이동
Next  현재 레코드보다 하나 뒤의 레코드로 이동
MoveBy(n)  n의 수만큼 이동 (n은 음수도 가능)
BOF  첫번째 레코드에 커서가 있을 때 Prior가 수행되면 True로 발생됩니다.
EOF  마지막 레코드에 커서가 있을 때 Next가 수행되면 True로 발생됩니다.▶ 필드 개체 지정방법
다음은 DataSet의 필드 개체 지정방법을 알아봅시다. 
DataSet의 필드 개체란 DataSet에 정의된 레코드의 한 필드를 말하는 것으로써, DataSet의 필드를 지정하는 방법에는 여러가지가 있습니다.
1. Fields Array
Fields Array는 필드를 배열처럼 사용하여 필드의 순서대로 배열의 첨자를 매기면서 지정하는 것입니다. 다음과 같이 하면 Edit1.Text의 값이 Table의 첫번째 필드에 들어가겠죠.

Table1.Fields[0].AsString := Edit1.Text;

2. FieldByName
FieldByName은 필드명을 바로 지정해서 값을 넣어줍니다.

Table1.FieldByName('CustNo').AsString := Edit1.Text;

3. FieldValues
FieldsValus는 마찬가지로 필드명을 지정해서 넣어주는 것인데 아래 두 문장과 같이 사용합니다. 아래의 두 문장은 같은 내용입니다.

Table1['CustNo'] := Edit1.Text;
Table1.FieldValues['CustNo'] := Edit1.Text;

자, 그럼 테이블에 값을 입력/편집/삭제/취소하는 작업을 시작해 볼까요?
▶ 등 록
테이블에 새로운 레코드를 등록하는 작업입니다.

Table1.Insert; Table1.Fields[0].AsString := Edit1.Text; Table1.Fields[0].AsInteger := StrToInt(Edit2.Text); Table1.Post;

▶ 편 집
현재 커서가 위치한 레코드의 값을 편집하는 작업입니다.

Table1.Edit; Table1.Fields[0].AsString := Edit1.Text; Table1.Fields[0].AsInteger

▶ 삭 제
현재 커서가 위치한 레코드를 삭제하는 작업입니다.

Table1.Delete;

▶ 취 소
테이블의 저장하기 전의 바뀐 내용을 취소하는 작업입니다.

Table1.Cancel;

▶ 필터링된 데이타의 커서 이동
필터 기능은 DataSet의 전체 레코드 중에서 지정한 조건에 맞는 레코드들로 DataSet으로 접근을 제한할 경우 사용할 수 있습니다. 
(조건에 맞는 레코드를 걸러준다고 생각하시면 되겠네요.)
필터를 사용하기 위해서는 먼저 Filter속성을 지정하시고, Filtered속성을 True로 하시면 됩니다.

Table1.Filter : '(CustNo >= 1000) and (CustNo <= 2000)' Table1.Filtered := True;

위의 예제와 같이 하시면 테이블의 CustNo필드의 값이 1000보다 같거나 크고 2000보다 작거나 같은 레코드를 걸러줍니다.
이런 필터링된 데이타의 커서 이동시에는 다음과 같은 메소드를 사용합니다.
FindFirst : 필터링이 된 데이타에 대해 첫번째 레코드로 커서를 이동
FindLast : 필터링이 된 데이타에 대해 마지막 레코드로 이동
FindNext : 필터링이 된 데이타에 대해 다음 레코드로 이동
FindPrior : 필터링이 된 데이타에 대해 이전 레코드로 이동▶ DataSet에 대한 검색기능
일반적으로 레코드 탐색을 위해서는 Locate와 Loopkup을 사용하여 특정 레코드를 찾아갈 수 있습니다.
▶ DataSet에 대한 검색기능
일반적으로 레코드 탐색을 위해서는 Locate와 Loopkup을 사용하여 특정 레코드를 찾아갈 수 있습니다.
1. Locate

Function Locate(const KeyFields: string; const KeyValues: Variant; Options: TlocateionOptions): Boolean; virtual;

KeyFields매개변수에는 검색하고자 하는 필드들을 지정하게 되며, KeyValues는 검색하려는 해당 필드의 필드 값들을 지정합니다. 그리고 Options에는 검색 값에서 대소문자를 구분할 것인지 부분 문자열도 허용할 것인지를 지정하게 되는데 loCaseInsensitive와 loPartialKey를 조합하여 사용할 수 있습니다. 
이 함수는 결과를 조건적으로 프로그램에서 사용할 수 있도록 결과값을 True/False로 돌려주는데, False결과값을 받으면 검색에 실패하였음을 의미하게 됩니다.
예제를 보시면 확실하게 아시겠죠?

With Table1 do Begin If Locate('Company;CustName', varArrayOf(['Unisco','James']),loPartialKey) then ShowMessage('레코드를 찾았습니다.'); End; End;

2. Lookup
Lookup은 지정한 검색 기준과 맞는 첫 레코드를 찾아주는 메소드입니다. 일치하는 레코드를 찾으면 DataSet과 연관된 계산필드(나중에 배워요!)와 Lookup필드의 재계산을 수행한 후 일치하는 레코드로부터 하나 이상의 필드를 돌려줍니다. 
그러나 Locate처럼 해당 레코드로 커서를 이동시키지 않으며 지정한 필드들에 대한 결과값을 돌려주게 됩니다.

Function Lookup(const KeyFields: string; const KeyValues: Variant; const ResultFields: string): Variant; virtual;

KeyFields 매개변수에는 검색하고자 하는 필드들을 지정하게 되며, KeyValues는 검색하려는 해당 필드의 필드 값들을 지정합니다. 그리고 ResultFields는 돌려 받고자 하는 필드들의 리스트이며, 그 결과값은 ResultFields로 지정해준 해당 필드를 결과값으로 돌려받게 됩니다.
역시 예제를 보시면 금방 아시겠죠!

Var LookupResults : Variant; Begin With Table1 do Begin LookupResults := Lookup('Company;CustName', VarArrayOf(['Unisco','James']), 'Company; Addr'); End; End;

다음은 Query컴포넌트에 대해 알아보겠습니다.
TQuery는 TTable컴포넌트와 같이 Data Access에 사용되는 NonVisual컴포넌트입니다. 
TQuery는 동시에 하나 이상의 테이블을 Access할 수 있으며, 테이블에 대한 Row/Column 단위의 일부분을 Acces할 수 있습니다.
TQuery는 위에서 언급한 바 처럼 DatabaseName속성과 SQL구문을 작성하여 데이타를 연결할 수 있으며, Prepare/UnPrepare메소드등이 있습니다.
Prepare : 파라미터를 사용하는 SQL을 Database엔진에 보내어 구문분석 또는 최적화
                     하여 Query의 빠른 수행을가능하게 합니다.
UnPrepare : Prepare했던 것을 해제하도록 합니다.▶ Parameter의 설정
Query컴포넌트의 SQL속성에 넣는 SQL문에는 조건에 맞는 데이타를 찾기 위해서 파라미터를 설정해 줄 수 있습니다.
SQL문에서 변수 앞에 ':'를 붙이면 그 변수가 필드가 아니고 매개변수임을 표시합니다. 매개변수에 대한 값을 할당하기 위해서는 설계시 Query컴포넌트의 params속성 편집기를 이용합니다. 
실행시 코드안에서 매개변수를 할당하기 위해서는 params속성을 이용하는 방법과 ParamByName을 이용하는 방법이 있습니다.
예제를 한번 보시죠.

SQL문 : Select * from Customer where custno >= :Pcustno
여기에서 Pcustno는 필드명이 아니라 매개변수이므로 앞에 ':'를 붙입니다.
이 변수에 값을 대입하기 위해서 다음과 같이 작성하시면 됩니다.
Query1.Params[0].AsString := '1234;
또는 
Query1.ParamsByName('Pcustno').AsString := '1234';

위의 방법은 실행시 코딩으로 작성하는 방법이구요. 설계시 작성하시려면 Query 컴포넌트의 SQL문을 작성하신 후, params속성을 이용합니다.


위의 그림과 같이 SQL문에서 정해준 변수가 나타납니다. 그러면 이 변수의 DataType(여기선 ftString)과 ParamType(여기선 ptInput)을 정해주시면 되는 거지요.
DataSet에 관한 내용이 너무도 많기 때문에 필수적인 내용만 언급하려 해도 숨이 차는군요.
DataSet에 관한 더 많은 부분을 공부하시고 싶으신 분은 도움말이나 델파이 책을 참고로 하시고, (꼭 더 공부하세요!) 이제 각종 DBControls들에 대해서 알아보겠습니다.

▶ DBGrid
각종 DBControls들은 이런 DataSet컴포넌트와 연결하기 위해서 DataSource컴포넌트를 지정해준다고 하였습니다.
Table의 DatabaseName속성을 DBDEMOS라고 정해주고, TableName을 Animals로 정해주신 후, Active속성을 True로 바꿔봅니다. 그리고 DataSource컴포넌트의 DataSet속성을 Table1이라고 정해주십시오. 이제 DBGrid에서는 DataSource속성만 지정하시면 설계시에도 DBGrid에 테이블의 내용이 나타나는 것을 볼 수가 있습니다.
물론 DataSource속성 이외에 여러가지 속성을 이용하시면 DBGrid를 더 유용하게 사용하실 수가 있습니다.


▶ DBNavigator
DBGrid처럼 DBNavigator도 DataSource속성만 지정하시면 됩니다.
VisibleButtons속성을 이용하시면 DBNavigator버튼들 중 보이고자 하는 버튼만 보이게 할 수 있습니다.


▶ DBEdit
DBEdit컴포넌트는 DataSource속성이외에 DataField속성을 정해주어야 합니다. 
여러 필드들 중 하나를 선택해야 하니까요.


▶ DBMemo
DBMemo컴포넌트는 테이블의 필드 중 Memo필드와 연결할 수 있습니다.

▶ DBImage
테이블의 필드 중 이미지 필드와 연결할 수 있습니다.
Stretch속성을 True로 정해주시면 DBImage컴포넌트의 크기에 맞게 이미지가 Stretch됩니다


'델파이' 카테고리의 다른 글

변수 변형  (0) 2018.10.26
<델파이 단축키 모음 >  (0) 2018.10.26
델파이 for문으로 별찍기  (0) 2018.10.25
반복문  (0) 2018.10.25
기본 함수 정리  (0) 2018.10.24