'Delphi Database'에 해당되는 글 1건

  1. 2007.12.05 데이터베이스 프로그래밍 기초

13장

데이터베이스 프로그래밍 기초

초고


 

 

 이장에서는 델파이에서 지원하는 기본적인 Data aware컴포넌트를 이용하여 프로그래밍하는 방법과 SQL문장을 사용하여 데이터를 조작하는 방법에 대하여 알아보겠다. 필자는 Data aware컴포넌트를 그다지 좋아하지는 않는다.

 

 필자가 아는 몇몇 프로그래머들은 기본적으로 델파이에서 지원하는 DBLable이나 DBEdit 사용하는 조차도 부담스러워하는 경우가 종종있다.

 

 델파이로 DB프로그래밍을 하는 방법에는 1, 2, 3, Multi-tier환경의 DB프로그래밍을 있다. 환경의 차이는 DB 어떤 프로토콜과 어떤 방법으로 접근하느냐에 달려있다. 하지만, 기본적인 Business Rule 적용하는 방법은 동일하다. 그러한 방법을 다음의 6가지 형태로 나누어 알아보도록 하자.

 

1)    자료를 DB에서 읽어오는 방법

2)    기본 데이터베이스 과련 유틸리티 사용방법

3)    자료처리시의 에러처리방법

4)    자료를 화면에 제시하는 방법

5)    사용자의 요구에 따라 DB 변경하는 방법

6)    마지막으로 사용자의 요구에 따라 프린터로 출력하는 방법

 

이상의 4가지 방법으로 알아보자.

 

1)    자료를 DB에서 읽어오는 방법

 

기본적으로 TDataSet이라는 구조를 살펴보면 쉽게 있다. TDataSet 구조는 다음과 같다.

 

) TDataSet

DataSet이란 델파이에서 지원하는 관계형데이타베이스의 테이블(열과 행으로 구분되는) 지칭합니다. 델파이의 Data access팔레트에 존재하는 다양한 DataSet컴포넌트를 만날 있습니다. 이러한 컴포넌트들은 관계형데이타베이스의 테이블을 읽어오기 위한 것이고 RDB 접근하는 방법으로 분리되어 있을뿐, 특별한 차이는 없습니다.

 

TDataSet -> TClientDataSet

->TBDEDataSet -> TDBDataSet -> TTable, TQuery, TStoredProc

 

위의 계층도를 살펴보면 TDataSet 모든 테이블의 상위에 존재하며 기본적으로 다음과 같은 기능을 지원합니다. 델파이에서 사용되는 모든 DataSet관련 컴포넌트는 다음과 같은 기능을 지원합니다.

 

구분

지원 프로퍼티/메소드

기본기능

Active, Open, Close

검색기능

First, Last, Next, Prior, MoveBy, Refresh, EOF, BOF, and, IsEmpty

편집기능

Edit, Insert, InsertRecord, Append, AppendRecord, Delete, Post, Cancel, Midufied, State, ChechBrowseMode, SetFields

북마크기능

BookmarkValid, CompareBookmarks, GotoBookmark, FreeBookmark, GetBookmark, Bookmark

Data-aware지원기능

ControlsDisabled, DIsableControls, EnableControls, ISLinkedTo

이벤트

BeforeOpen, AfterOpen, BeforeClose, AfterClose, BeforsInsert, AfterInsert, BeforeEdit, AfterEdit, BeforePost, AfterPost, BeforeCancel, AfterCancel, BeforeDelete, AfterDelete, BeforsScroll, AfterScroll, onCalcFiels, onDeleteError, onEditError, onNewRecord, onPostError

필드지원기능

FieldByname, FieldByNumber, FieldDefs, FieldCount, Fields, FIeldValue, DefaultFields, FindField, GetFieldList, GetFieldNames, UpdateRecord, ClearFields

하위레벨지원기능

ActiveBuffer, CursorPosChanged, GetCurrenRecord, Translate, RecordSize

 

 

 

이러한 TDataSet TClientDataSet 일반적인 BDE 사용할 TTable, TQuery, TStoredProc에게 파생됩니다.

-          TClientDataSet : 전장에서 자세히 설명하였지만 multi-tier 환경에서 사용하며 간단한 1-tier환경에도 사용할 LoadFromFile, SaveToFile 지원되며 ClientPC에는 DBCLient.dll이라는 파일 하나만 지원되면 됩니다.

-          TTable, TQuery, TStoredProc : 델파이에서 지원되는 BDE 사용하여 데이터베이스에 접근하는 방법을 지원하며 보통 2-tier환경으로 C/S환경에 적용됩니다.

 

) TDataSet 기본적인 기능

 

대다수의 기능은 위에서 보여준 표를 참조하면 무방하며 델파이 1, 2, 3에서의 구조와 거의 동일하다 다만 몇가지 참고하여야 내용을 살펴보자.

 

1)  Active, Open, Close

실제로 Active := True, Open 동일한 동작을 수행한다. 이러한 구분을 만들어 놓은 이유는 Design Time Run Time환경에서 동일한 동작을 수행하기 위한 하나의 방편이며, TQuery 형태인 경우 Open문으로 수행하지 못하는 몇가지 작업이 있다. TQuery 경우 ExecSQL이라는 메소드가 있는데 메소드는 데이터를 조작하는 작업으로 Inser문이나 Delete, Update문인경우에 ExecSQL 사용한다. 이경우 수행되는 내용을 Active 통하여 검사할 있다.

 

2)  TDataSet 상태

현재 DataSet 작업상태를 표시하는 것으로 State프로퍼티를 참조하면 현재 상태를 있다.


실제 델파이의 Help화면을 참조한 부분이다.

 

3)  TDataSet 조작

데이터를 검색하고 환경을 조절하는 방법을 알아보자.

 

First, Next, Prior, MoveBy(수치) 레코드의 행을 이동하는 방법이다. 그리고 BOF EOF 레코드의 처음과 끝을 참조하기 위한 Boolean형태의 프로퍼티이다.

 

해당 레코드의 필드를 조작하기위해서 사용하는 프로퍼티는 다음과 같다.

 

테이블.FIelds[ 0 ].asString

테이블.FIeldByName( ‘필드명’ ).asString

테이블.FIeldValues[‘필드명’]

테이블필드명.value <- 필드에디터에서 필요한 필드를 추가하여 주어야 사용할 있다.

 

위의 4가지 표현방식은 모두 동일하다. 개발자는 어떠한 방식을 사용하여도 좋으나 가장 무난한 방법은 FieldByName 무난하게 사용하기 편하다.

 

Insert, Edit, Post, Delete, Cancel등은 데이터를 추가하거나 삭제하고 취소하는 방법이다.

table1.insert;

table1.fieldByname(‘필드명’).asString := ‘’;

table1.fieldByname(‘필드명’).asString := ‘’;

table1.post;

 

table1.edit;

tabel1.fieldByname(‘필드명’).asString := ‘’;

tabel1.fieldByname(‘필드명’).asString := ‘’;

table1.post or table1.cancel;

 

table1.delete

 

이상은 DataSet 사용하여 자료를 추가하고 자료를 변경하고 자료를 지우는 방법이다. 다만, 이러한 작업은 DataSet DB Cursor 위치한 위치에서 작업되며, DB Cursor 이동하는 방법은 위에서 설명한 레코드 행을 이용하는 방법(Insert, Edit, Post, Delete, Cancel) 사용하면 된다.

 

) 자료를 읽어오는 방법

 

이제 DataSet 기본적인 내용을 살펴보았다. 이제 DataSet에서 파생된 TTable TQuery 기능을 살펴보자.

 

크게 TQuery TStoredProc 거의 동일한 기능을 수행하며 TQuery TTable 차이점은 테이블을 보는 관점의 차이이다. TQuery에서는 테이블을 바라보는 정의를 SQL문장으로 기술하며 사용자가 원할 경우에 사용자가 원하는 시점을 사용하기 위해 SQL문장의 다양한 기능을 이용하여 Join이나 View등을 통하여 2차원적인 테이블을 바로보는 시점을 만들어 내는 형태의 테이블이 많은 경우에 사용한다.

 

TTable 경우에는 테이블의 형태가 고정되어 있는 경우가 많거나 델파이의 기본적인 기능중에 하나인 Master-detail기능을 이용할 경우에 사용한다.

 

1)개발자가 테이블을 바라보는 방법

(1) SQL문장으로 원하는 테이블을 지정하는 방법

(2) TTable 컴포넌트에서 원하는 테이블을 지정하는 방법

select * from 테이블명

 

l       참고

 델파이에서 Alias기능에 대하여 델파이의 별명기능은 다른 RDB 기능에서 유래된다. 다른 RDB 경우에 DataBase 불리우는 데이터 공간을 만들어 고유의 명칭을 부여한 다음 해당 데이터공간에 원하는 테이블을 생성하는 방법으로 데이터를 관리한다.

  방식은 하나의 목표로 사용되는 테이블들의 구분과 물리적은 위치를 고정함으로써 데이터베이스의 성능을 향상하는 경우에 사용되었다. MS-SQL 경우에는 데이터베이스의 크기를 고정하고 단일의 파일을 생성하여 사용한다. InterBase 경우에도 단일 파일로 만들어진 데이터베이스를 사용한다.

 Paradox DBase, Fox 경우(델파이 바라보았을떄) 많은 테이블이 존재할 있고 이러한 테이블을 단일 형태로 관리할 있는 방법으로 이러한 별명(Alias) 사용할 있다. Access 경우 하나의 Alias 하나의 파일로 존재한다.

 델파이에서는 이러한 데이터베이스를 관리하기 위한 방법으로 TDataBase컴포넌트와 TSession컴포넌트를 지원한다. 두컴포넌트는 Alias 관리하며 해당 데이터베이스의 접근을 위한 username이나 password 같은 지원기능도 부여한다. 일반적으로 TDataBase컴포넌트를 통하여 Alias 접근하고 가상 Database 이름을 부여한다음 가상 DataBase컴포넌트의 이름을 통하여 필요한 DataSet컴포넌트를 통하여 원하는 데이터베이스의 테이블에 접근한다.

 

) 검색하는 방법

 

테이블은 방대한 자료를 가지고 있으며 기본적인 이동명령어인 First, Next, Prior, MoveBy문장을 사용하여 자료를 이동하며 각각의 필드에 있는 값을 읽어 있다.  하지만 테이블에 많은 데이터가 쌓이므로 이러한 이동명령어로만 차례로 IF문장으로 비교하는 방법을 사용하면 비효율적이 아닐 없다.

 

해서 각각의 테이블에 인덱스를 사용하는데 다음의 방법은 인덱스가 존재한다면 델파이 내에서 가장 빠른 방법이다.

 

table1.setRangerStart;

table1.fieldByname(‘필드명’).AsString := ‘검색값’;

table1.setRengeEnd;

table1.fieldByname(‘필드명’).AsStrign := ‘검색값’;

table1.ApplyRange;

 

이문장은 필드명의 시작값과 끝값을 지정하므로써 해당 테이블의 인덱스를 참조하여 빠르게 원하는 레코드들을 배열한다. 인덱스가 존재한다면 가장 빠른 방법이다. 문제는 TTable에만 적용되는 방법이다.

 

아니면 TTable(Tquery 지원한다.) Filter기능을 사용할 있다. Filter기능은 자주 사용되지 않는 필드의 찾는 방법이 있다.

 

table1.filtered := true;

table1.filter := ‘(필드명 >= ) and ( 필드명 <= )’;

 

이렇게 필터기능을 사용한다음 FindFirst, FIndLast, FindNext, FIndPrior 사용할 있다.

 

혹은 인덱스가 지원되는 TTable이나 TClientDataSet 같은 컴포넌트에서는 다음과 같은 방법을 사용할 있다.

 

EditKey, FindKey, FindNearest, GotoKey, GotoNearest, SetKey 사용하여 TQuery TClientDataSet에서 사용할 있다. 사용방법은 다음과 같다.

 

table1.SetKey;

table1.FieldByname(‘필드명’).asString := ‘검색값’;

통하여 검색하고자 하는 필드에 검색값을 넣은다음

 

if not table1.gotokey then showmessage(‘찾지못함’);

 

table1.gotokey 사용하면 해당 값으로 이동하며 값이 존재하지 않는다면 False 리턴되어 온다.

 

table1.Nearest 사용하면 해당 값과 가장 근사치인 값의 레코드로 이동한다.

 

FindKet FindNearest Setkey GotoKey, Nearest 합쳐놓은 것과 동일하다.

 

TQuery컴포넌트를 사용할 경우에는 생각외로 간단하다. 해당 SQL문장을 다음과 같이 기술하면 된다.

 

with Query1 do

beign

                   active := false;

                   sql.clear;

                   sql.add( ‘select * from 테이블명 where 필드명 조건 ’ );

                   active := true 또는 open 또는 execSQL

end;

 

l       참고

TQuery 기타 SQL 사용하는 컴포넌트를 사용할 경우 Active Open/Close ExecSQL 차이점은 단순히 데이터를 View하는가, 데이터를 조작한후에 데이터를 리턴받느냐에 달렸다. SQL문장중에 데이터를 조작하는 INSERT,DELETE, UPDATE문장의 경우 execSQL 사용하여야 한다. 그리고 SELECT문장의 경우 원하는 데이터를 리턴받아야 하므로 일반적인 TTable 동일하게 Active, Open/CLose 사용한다.

 

) 자세한 SQL문장 사용방법

 

세부적인 SQL문장을 사용하기전에 델파이에서 지원하는 Local Interbase 살펴보자, 델파이C/S버전에서는 C/S프로그램을 제작하기 편하도록 테스트용 Local Interbase 같이 지원된다. 기본적인 C/S작업은 Local Interbase 사용하여 작성하여 보자.

 

l       참고

Interbase 다른 RDB와는 다르게 Remote Local DB 접근할 경우 Alias에서 해당 DataBase 지정할 경우에 컴퓨터이름과 해당 디렉토리를 모두 기술 하여 주어야 한다. 와같은 형태가 불편할 있으나,  물리적인 데이터베이스를 관리하기가 편하므로 Unix WindowsNT 경우 하드가 모자라서 확장할 경우 간단하게 이동을 한뒤에 해당 BDE세팅에서 위치만 변경하여 주면 간단하게 변경할 있는 장점도 있다.

 

LocalInterbase 기본 ID

UserName : SYSDBA

Password : masterkey

 

기타 InterBase 기본적인 사용방법

 

(1)  InterBase Server Manager

InterBase그룹의 Interbase Server Manager프로그램은 Interbase 전반적인 데이터베이스를 다루는 DBA 입장에서 Interbase 다룰 있다. 프로그램은 local Remote모두 동일하다.

-          File/Server Login잡업에서는 Remote local Interbase 데이터베이스에 접근할 있도록 한다. (SYSDBA/masterkey 접근한다)

-          Tasks/User Security에서 새로운 사용자를 추가한다. ( 사용자명을 사용하여 프로그램에서 Interbase 접근한다.)

(2)  Windows ISQL

-          Console SQL 지원하는 프로그램으로 Interbase 데이터베이스나 테이블을 추가/수정/삭제할 있는 SQL문장으로 Interbase 조작할 있다.

-          File/Create DataBase 선택하면 원하는 위치에 DataBase 생성할 있다.

-          File/Drop Database 선택하면 DataBase 삭제할 있습니다.

 

l       참고

Interbase 기본적으로 gdb라는 확장자명을 사용합니다.

l       참고

모든 SQL문장으로 이루어진 작업은 Commit이라는 명령어로 push하여주어야만 작업이

 

이제 SQL문장을 사용하여 DataBase 생성하고 테이블을 만들고 조작하는 방법을 알아보자.

 

(3)  테이블 생성

 

create table 테이블명 ( 필드명 속성 형태 키형태, … ) 으로 기술하면 되는데 하단의 예를 살펴보자.

 

create table data ( code char(5) not null primary key, name varchar(20), age integer )

 

예제는 data라는 테이블을 생성하는데 기본키는 code라는 char(5)형태의 (null)값이 존재하지 않는 필드와 name이라는 varchar 20자리, age라는 수형 필드를 가지는 테이블을 만들려는 SQL문장입니다.

 

이러한 작업은 SQL문장을 사용할 수도 있고, DataBase DeskTop에서 테이블을 만들어 사용할 있습니다.

 

(4)  레코드 추가

 

insert into 테이블명 ( 필드값 ) values ( 넣는 )

 

(5)  레코드 수정

 

update from 테이블명 set 필드명 = where 조건

 

(6)  레코드 삭제

 

delete from 테이블명 where 조건

 

이상으로 기본적인 SQL문의 사용방법을 알아 보았습니다.

 

(7)  Stored Procedure 사용방법

 

Stored Procedure 일련의 SQL문장으로 이루어진 서브루틴과 동일합니다. 2-tier이상의 프로그램을 제작하는 경우에 많은 테이블을 Open하여 반복적인 작업을 수행하는 경우가 빈번하다면 해당 테이블마다 SQL문장을 통하여 Open한다음 Client에서 작업을 하게 되면 비효율적인 네트웤트래픽을 비롯하여 여러가지 자원의 낭비가 발생합니다.

 

이떄에 Stored Procedure 사용하여 해당 문장을 기술할 있습니다. 또는 고정된 SQL문장으로 Client 요구를 파라메터로 받아들여서 일반적인 서브루틴처럼 작동하는 모듈을 구성할 경우에도 이와같은 Stored Procedure 사용할 있습니다.

 

다음의 예는 Stored Procedure 만드는 내용입니다.

 

Create Procedure Insert_data ( PCode varchar(4), pname varchar(20), pag smallint )

as

begin

                   begin

                                      insert into data values ( :pcode, :pname, :page );

                   end

suspend;

end

 

이런 문장을 수행하면 해당 데이터베이스에 Insert_data라는 Stored Procedure 생성됩니다. 이제 델파이에서 StoredPricedure컴포넌트를 사용하여 위의 Stored Procedure 호출하여 사용할 있습니다.

 

with StoredProc1 do

begin

                   StoredProcName := ‘insert_data’;

                   paramByname( ‘Pcode’ ).asString := ‘’;

                   paramByname( ‘Pname’ ).asString := ‘’;

                   paramByname( ‘PAge’ ).asInteger := ;

                   ExecProc;

end;

 

(8)  자세한 TDataBase 컴포넌트의 사용

 


(1)동적인 Alias생성

DataBase컴포넌트를 사용하면 존재하는 Alias 사용하여 접근할 있으며, 또는 실행환경에서 하나씩 BDE Alias 생성시켜주는 불편을 사용하지 않고 DataBase컴포넌트를 통하여 수행중에만 존재하는 Alias 생성하여 사용할 있게 하여 줍니다. (가장 많이 쓰이는 용도)

 

위의 다이얼로그중에 Parameter overrides부분에는 해당 데이터베이스에 접근하기 위한 다양한 값들을 세팅할 있게 합니다. Defaules 누르면 기본적인 정보가 나타납니다. LoginPrompt 세팅하므로써 사용자에게 userName Password 물어보는 다이얼로그르 생략할 있습니다.

 

keepConnection 데이터베이스를 열떄마다 사용자명과 암호의 입력작업을 중복입력할 필요가 없게 줍니다.

 

그러나~~~

 

DataBase컴포넌트를 사용하는 가장 이유는 다음의 이유때문입니다.

 

(3) 트랜잭션의 관리

 

보통 C/S프로그램을 제작하는 경우에 초보자들이 가장 곤란해 여기는 부분이 바로 트랜잭션의 관리입니다.  트랜잭션이란 SQL문장으로 기술된 논리적인 하나의 작업단위를 뜻하는데, Remote DB 사용하는 경우 중간의 네트웍 때문에 자료의 비정상적인 전송이나 오류가 발생하는 경우가 빈번합니다. 특히나, 테이블이 하나가 아닌, 2~3 이상의 테이블의 값을 수정하거나 추가하는 경우에 테이타의 무결성에 치명적인 문제가 발생할 있습니다.

 

3개의 테이블을 수정하는데 2개의 테이블만 수정되고 1개의 테이블에 값이 수정되지 않는다면 데이터는 나중에 치명적인 문제를 발생할 있습니다. 이떄에 이러한 테이블의 수정작업을 하나로 묶은 작업단위가 트랜잭션이라합니다.

 

트랜잭션은 데이터의 하드웨어적인 문제의 Consistency(일관성) 다중 사용자 접근에서의Integrity(무결성) 보장해 줍니다.

 

(4) 트랜잭션의 관리방법

 

-기본제어

델파이는 기본적으로 트랜잭션을 기초적인 단계에서 수행합니다. 바로,  Post AppendRecord등과 같은 메소드에서 자동작으로 해당 트랜잭션을 수행하고 commit하게 됩니다. 문제는 이런 기본적인 제어방법은 추가/수정/삭제작업의 트랜잭션시의 문제발생은 막을 있으나, 네트웤트래픽이나 여러 개의 작업단위로 이루어진 문장에서는 보장할 업세 됩니다. 이경우에는 다음에 설명할 방법으로 개발자가 일일히 기술해 주어야 합니다.

 

-개발자가 지정하는 제어방법

메소드

설명

StartTransation

트랜잭션의 시작 포인트를 설정한다.

Commit

진행된 트랜잭션을 물리적인 데이터베이스에 적용한다.

RollBack

현재 진행된 트랜잭션을 원상태로 복귀시킨다.

l       참고

델파이4에서는 Local DB Paradox에서도 이러한 트랜잭션을 지원합니다.

 

(5) 트랜잭션의 종류

전장에서 델파이에서 지원되는 트랜잭션의 옵션과 지원되는 DB에서의 동작에 대해 설명하였습니다. 밖에도 BDE세팅에 해당 데이터베이스의 트랜잭션의 동작에 대한 기본설정을 있습니다.

바로 SQLPASSTHRU MODE인데, 다음의 3가지로 지원됩니다.

 

MODE

설명

SHARED AUTOCOMMIT

기본적인 설정으로 레코드()단위의  모든 작업에 Commit 자동 작동시킵니다. SQL BDE메소드가 동일하게 동작합니다.

SHARED NOAUTOCOMMIT

프로그램내부에서 정확하게 트랜잭션이 기술된 시점에서 트랜잭션을 수행합니다. SQL BDE메소드가 동일하게 동작합니다.

NOT SHARED

완전히 별개의 트랜잭션을 기술하며 SQL BDE 다른 연결방법을 사용합니다.

 

(6) 트랜잭션의 Trnaslsolation형태

설명

tiDirtyRead

가장 낮은 방법

데이터 수정시에 다른 User 접근을 허용한다. 읽기/쓰기의 락이 걸려있지 않는다.

tiReadCommitted

보통

데이터의 수정시에 읽기가 시작되고 종료되는 EOT시점까지 Lock 유지한다.

tiRepeatableRead

가장 높은 방법

일기/쓰기시에 EOT시점까지 Lock 유지한다.

l       참고

델파이에서 지원되는 DB Translsolation 값은 각각의 DB마다 동작을 지원하는 방법이 모두 틀리다, 예는 전장에 기술되어 있다.

 

) LocalDB RDB 이동

 

일반적으로 작성된 Paraodx DBase형태의 DB RDB 데이터로 전송하는 경우에 해당 프로그램을 작성할 필요없이 간단한 방법으로 이러한 데이터를 전송할 있다. 이경우에 개발자는 Alias 두개 준비하여 Source에서 Target으로 데이터를 전송하면 그만이다.

 

Data Migration Wizard 사용하여 데이터 이전작업을 수행하면 된다.

 

다만 주의할 것은 데이터베이스의 형태가 바뀌므로 전송시에 살펴볼 내용은 다음과 같다.

(1) 각각의 필드의 속성이 Target에서 지원되는지 살펴보아야 한다.

(2) 필드명중에 해당 DB 예약어인경우가 있다. 필드명을 살펴보아야 한다.

l       참고

필자의 경험상 자료를 올리는 경우에 Index 모두 삭제한 다음 Upsize하는 것이 성공확률이 높다.


) DataSource 사용방법

DataSource 단순히 DataSet컴포넌트와 Data-aware컴포넌트를 연결하는 연결방법으로 사용하지만은 않는다. 여기서는 DataSource 몇가지 유용한 기능에 대하여 알아보자.

 

(1)  Master Detail기능

Master Detail기능을 사용할 경우에 Master Sub 경우 Sub TTable 사용하여야 한다. 이경우는 DataSet Sub DataSet 조작하는 경우이다.

 

(2)  다양한 이벤트의 사용

 

이벤트

설명

onDataChange

해당 DataSet 변경될 경우에 발생한다.

onStateChange

해당 DataSet 작업형태가 변경될 경우에 발생한다.

onUpdateData

물리적인 데이터가 변경될 경우에 발생한다.

 

) Cashed Updates

이것은 트랜잭션과 유사한 개념입니다. 개발자가 원하는 테이블에 변경작업(추가/수정/삭제)작업을 취할 경우에 다중 레코드를 처리하는 것을 허용하여 중간 버퍼에 이러한 작업을 유지한다음 원하는 시점에 작업을 물리적인 데이터베이스에 영향을 주는 방법을 말합니다.

 

기능은 DataSet 컴포넌트에 모두 해당되며 해당 CachedUpdates 프로퍼티에 True 설정되어 있어야만 동작이 가능합니다.

 

동작코드는 다음과 같습니다.

 

메소드

설명

ApplyUpdates

버퍼의 내용을 물리적인 DB 저장합니다.

CancelUpdates

현재 버퍼에 저장된 변경내용을 삭제합니다.

RevertRecord

현재 레코드만 원래의 레코드로 변경합니다.

 

l       참고

DataBase1.ApplyUpdates( [테이블, 테이블] ) 사용하면 여러 개의 테이블에 있는 Cashed Updates 하나의 코드로 동작시킬 있습니다. 다만, CancelUpdates DataBase컴포넌트에서 지원하지 않습니다.

 

) TUpdateSQL

TQuery, TStoredProce컴포넌트 이외에 기본적으로 TUpdateSQL이라는 컴포넌트가 지원됩니다. TQuery컴포넌트에서는 Select, Insert, Delete, Update등의 모든 SQL문장을 사용할 있습니다. 심지어는 Stored Procedure Trigger 만들 있습니다. 하지만, 실제 SQL문장을 사용하다 보면 자그마한 리소스나 속도문제에 민감해집니다.

 

TQuery 모든 SQL문장을 동작시키는 많은 내부코드를 가지고 있습니다. 그렇지만 일반적인 SQL문장을 사용하는 경우에는 Insert, Update, Delete 3가지 기본적인 작업이 많이 쓰입니다. 이경우에 보다 빠른 작업과 관리의 편리성을 위하여 TUpdateSQL컴포넌트를 사용합니다.

 

단순화된 컴포넌트는 필요한 3가지의 행동코드를 가질 있어서 간단한 Stored Procedure처럼 사용할 있습니다. 매번 추가/수정/삭제할 때마다 SQL프로퍼티의 내용을 지웠다 추가했다하는 코드도 줄일 있으니까요.

 

일반적인 코드는 TQuery 동일합니다.

 

) Gloval Session 기능사용하기

 

델파이에서 현재 사용하고 있는 데이터베이스의 정보나 테이블정보를 검색하는 경우가 있습니다. 보통 이경우에는 Session 사용되는데 델파이를 서보면 아시겠지만 기본적으로 Session 하나 Global 선언되어 있고 Default Session으로 사용됩니다.

 

Session.GetDriveNames( Strings객체 ) 사용하면 현재 사용되는 데이터베이스 드라이브정보를 얻을 있습니다.

Session.GetDataBaseNames( Strings객체 ) 사용하면 현재 사용되는 데이터베이스명을 얻을 있습니다.

Session.GetTableNames('데이터베이스명', 형태('*.db'),False, False, Strings객체);

 

l       참고

String객체를 보기위해서는 ListBox Items Memo Items 사용할 있습니다.

 

) Bookmark사용하기

 

북마크는 책갈피라고 생각하시면 간단합니다. 원하는 위치를 지정해 놓고 해당위치로 빠르게 이동할 있게 하여 줍니다.

 

북마크 := Table1.GetBookMark; // 현재의 위치를 저장합니다.

Table1.GotoBookmark( 북마크 ); // 해당 북마크로 이동합니다.

table1.FreeBookmark( 북마크 ); // 해당 북마크를 삭제합니다.

 

 


2)    기본 데이터베이스 관련 유틸리티 사용방법

 

)DataBase Desktop


DataBase Desktop 델파이1에서부터 크게 변한 것이 없습니다. DeskTop 가장 유용하게 사용되는 경우는 개발자가 Paradox형태의 DB 개발하는 경우 Paradox내부의 참조무결성 연결과 DB자체의 입력값제한과 같은 기능을 지원하기 위한 경우에 주로 사용합니다. 자세한 설명은 생략하도록 하겠습니다.

 

) SQL Explorer


프로그램은 델파이1 포함되어 있던 DeskTop 발전된 형태로 본격적인 SQL문장의 테스트와 델파이 내부 IDE 연결되어 IDE에서 TTable이나 TQuery등에서 바로 연결하여 사용하거나 원하는 테이블의 필드를 IDE 드래그하면 해당 DBEdit이나 DBlabel 바로 얻을 있다.

그리고 가장 강력한 기능은 사전(DIctionary)기능과 속성집합(Attribute Sets)이다. (자세한 설명은 전장에서 설명하였으므로 간단하게만 서술한다.)

 

기능은 델파이로 개발하는 과정에서 필요한 테이블의 구조와 데이터사전을 구축할 있는 것으로 상당한 분량의 업무를 줄여주는데 유용하게 사용된다. 만들어진 데이터사전을 바로바로 추가하고나 보관하여 델파이 자체만 가지고도 실시간으로 프로그램을 구축할 있는 간단한 DB업무도구로 사용할 있다.

 

) SQL Monitor


프로그램은 C/S프로그램을 작성하거나 수행중인 RDB SQL문을 주고받는 동안 이루어지는 작업을 모니터할 있게 해준다. 실제 수행시간과 전달되는 문장으로 프로그램의 퍼포먼스를 높이거나 문제해결에 도움을 주는 도구입니다.

 

메뉴중에 Trace Options 대해 알아보겠습니다.


내용

Prepared Query Statements

RDB 보내지는 문장

Executed Query Statements

RDB 보내어져 수행되는 문장

Statements Oprations

수행되는 모든 작업(Fetch, Execure)

Connect/Disconnect

연결과 해제에 대한 내용

Transations

트랜잭션작업(Begin, Commit, Rollback)

Blob I/O

Blob데이타작업

Miscellaneous

위에 서술된 내용이외의 작업

Vendor Errors

RDB에서 반환된 에러번호

Vendor Calls

RDB에서 호출되는 API함수

 

 

 

 


3)    데이터베이스처리스의 에러처리 방법

) EDatabaseError

EDatabaseError 대한 클래스를 분석한다. 실제 DB프로그래밍시에 부딧히게 되는 대다수의 문제점은 EDatabaseError클래스를 사용함으로써 문제를 해결할 있다.

 

보통

 

try

                   … DB작업

except

                   on EDatabaseError do

                  

                   raise;

end;

 

DB작업중에 문제가 발생하는 부분을 try..excpet문장으로 감싸고 해당 부분에서 EDataBaseError객체로 발생한 에러를 추적하여 대처할 있다.

 

그러나, EDatabaseError에서는 직접적으로 어떤 오류가 발생하였는지는 없고 실제 내용은 파생된 EDBEngineError 참조하면 가능하다.

 

보통은 DataSet OnPostError, OnEditError, OnDeleteError 이벤트를 참조하면 대다수 문제가 해결됩니다.

 

해당 이벤트에는 문제가 발생된 DataSet EDatabaseError객체가 전달되며 문제를 해결하기 위해 TDataAction 지정하게 됩니다. 지정되는 값은 다음과 같습니다.

 

daFail : 실패, daAbort : 중단,  daRetry : 재시도

 

) EDBEngineError

EDBEngineError Errors배열에 BDE에서 발생되는 모든 오류의 값과 내용을 가지고 있습니다.

 

ErrorsCount 발생한 에러의 개수

Errors에는 발생된 에러의 내용이 TDBError 배열형태로 들어있습니다. TDBErrors 내용은 다음과 같습니다.

 

속성

내용

Category

오류코드범주

ErrorCode

오류코드숫자(DBIResult형태)

Message

서버에 연결되어 있으면 서버에서 리턴된 에러메시지, 보통은 BDE 에러메시지

NativeError

RDB에서 발생한 에러인지 체크, 0 리턴되면 서버오류가 아닌 BDE오류입니다.

SubCode

하위 오류코드

l       참고

Category SubCode Byte형태로 코드는 상위와 하위의 에러코드를 지칭합니다.

 

리턴되는 에러코드는 BDE.INT화일을 참조하면 다양하게 존재하는 에러의 코드를 참조할 있습니다. 해당 BDE.INT에는 Delphi4 DOC디렉토리에 333kB 파일로 존재합니다. 실제 에러는 Byte형태로 존재하며 DBI상에서의 에러는 ErrorCode Word타입의 자료를 참조하면 에러를 찾을 있습니다.

 


 

4)    자료를 화면에 제시하는 방법

 

 


5)    사용자의 요구에 따라 DB 변경하는 방법

 

사용자는 데이터를 조작하기 위해 개발자가 만들어 놓은 EditBox 값을 채워놓고 해당 버튼을 Click하였을 것이다. 이때에 개발자는 해당 내용으로 자료를 변경하여야 한다. 전에도 설명하였지만 다시한번 살펴보자.

 

그중에 SQL( Structured Query Language ) 자세히 살펴보자. SQL DDL( Data Defination Language) DML( Data management Language ) 나뉜다. 델파이는 이러한 SQL 완벽하게 지원한다.

 

SQL문장을 자세히 살펴보자.

 

) Select

 

Select 선택필드 into 변수명 또는 레코드명 from 테이블 where 조건;

 

형식으로 기술된다. 

선택필드에는 * 기술되면 전체 필드를 지칭하며 필요한 필드명을 나열하면 해당 필드로 구성된 테이블 뷰를 만들게 된다. 이때에 필드의 개수가 적을수록 해당 SQL문장의 동작속도는 빨라지게 된다.

 

l       참고

TQuery컴포넌트에는 prepare라는 메소드가 존재한다. 메소드는 SQL문장을 수행하기전에 해당 문장을 최적으로 수행할 있는 환경을 구성한다. 문장은 사용하는 것이 좋다.

 

테이블절에는 여러 개의 테이블을 기술할 있다.

 

select 테이블명A.필드명, 테이블명B.필드명 from 테이블명A, 테이블명B

 

두개이상의 파일을 Join하여 하나의 View 있도록 하여 준다.

 

) Delete

 

Delete from 테이블명 where 조건;

 

해당 테이블에 해당 조건에 맞는 레코드를 삭제한다.

 

) Insert

 

Insert into 테이블명 (필드명, … ) values (, … );

 

) Update

 

update 테이블명 set 필드 = , … where 조건

 

) Like연산자

 

위에서 언급한 SQL문장의 조건절에는 다음의 Like연산자를 사용할 있다. Like연산자는 해당 필드에 속해있는 값들 중에 비슷한 값을 찾아내는 연산자로 DOS Command *(와일드카드) 동일하다.

 

SQL문장네에 % 사용하게되면 Like연산자가 동작하게 된다.

 

select * from 테이블 where 필드 like ‘%’;

 

해당 필드에 속해있는 값들중에 으로 시작되는 데이터를 찾을 것이다.

 

) Order By

 

레코드를 정렬하는 경우에 사용한다.

 

select * from 테이블 order by 필드명

 

오름차순과 내림차순은 Asce Desc 해당 필드명 뒤에 붙여주면 해당 형식으로 정렬된다.

 

) Group By

 

선택된 필드를 그룹단위로 묶어서 중복된 것만 보여준다.

 

select 필드값, sum( 필드값 ) “합계”, avg( 필드값 ) “평균” from 테이블명 group by 테이블명

 

해당 테이블명이 중복된 값의 합계와 평균을 출력한다.

 

 


 

6)    마지막으로 사용자의 요구에 따라 프린터로 출력하는 방법

 

프린터로 출력하는 방법에는 여러가지 방법이 있습니다.

) 일반적인 프린터 메소드를 사용하는 방법

) QuickReprot 사용하는 방법

) 다른 서드파티를 사용하는 방법

 

) 일반적인 프린터 메소드를 사용하는 방법

WriteLn Canvas 사용하여 원하는 출력물을 만들어 있습니다.  WriteLn 사용방법은 다음과 같다.

 

WriteLn( 텍스트화일, 문자열, … );

 

사용하여 원하는 텍스트 문자열을 출력할 있다.

 

l      

보통 Table이나 Query Open하여 놓은 상태, 특히나 DBAware 사용한 경우에는 화면에는 작업하다가 프린팅과 같은 전체 자료를 사용하여 출력하는 경우에는 Bookmark 사용하여 작업하던 장소를 저장한다음 테이블이나 Query문을 다시 동작하여 사용하면 간단하게 작업할 있다. 또한 Data-aware 사용할 경우 전체 내용을 검색할 경우 DataSource 연결된 경우에는 해당 데이터의 Refresh 때문에 수행이 느려진다.

 

때문에 DisableControls EnableControls 활용하여 활성을 조절하면 프로그램의 수행이 빨라진다.

 

Canvas사용방법

 

일반적인 문자열을 출력하는 경우에는 WriteLn 무방하지만, 색을 지정하거나 그림이나 도형을 출력하는 경우에는 Canvas 사용하여 출력하여야 한다.

 

printer.BeginDoc;

printer.Canvas.TextOut( x, y, 문자열 );

printer.EndDoc;

 

주의할 점은 x, y 해당 좌표값을 지정하는 것과 좌표값은 Pixel단위이므로 해당 Font Height Width 알아서 계산해 주어야 한다는 점과, , EndDoc 호출하여 끝을 맺어야 한다. 이부분이 빠지게 되면 무한루프를 돌우려가 있으니 첨가하여야 한다. 이외에도 newPage, Abort, PageNumber등의 프로퍼티로 새페이지, 출력중단, 페이지번호알기등의 프로퍼티등이 지원된다. 자세한 것은 델파이 Help 참조하자.

 

다음의 코드는 Delphi Help Printer Example 나와있는 코드로써 위의 WriteLn으로 해당 내용을 출력하는 방법을 보여주고 있다.

 

var

  Line: Integer;

PrintText: TextFile;

begin

  if PrintDialog1.Execute then // 프린터 다이얼로그에서 원하는 프린터를 선택하도록 한다.

  begin

    AssignPrn(PrintText);   {PrintText 프린터정보를 연결한다.}

    Rewrite(PrintText);     {출력할 있도록 한다.}

    Printer.Canvas.Font := Memo1.Font;  {사용할 폰트를 지정한다. 여기서는 memo 내용을 출력하는 코드이므로 memo 폰트를 사용한다.}

    for Line := 0 to Memo1.Lines.Count - 1 do

      Writeln(PrintText, Memo1.Lines[Line]);            {메모에 있는 내용을 출력한다.}

    CloseFile(PrintText); {출력이 끝나면 해당 정보를 닫는다.}

  end;

 

l       참고

PrimaryKey 없는 RDB 사용할 있습니다. 하지만Primary Key 없으면 관계형 DB라고 없습니다. 왜냐구요? 관계형DB 테이블과 테이블과의 연관관계를 가질 있는 DB 형태를 가진 DB 관계형DB라고 합니다. Primary Key 없다면 NDB ISAM이라 부를 있겠지요?


) Quick Report 사용

 


QuickReport 델파이 3에서부터 기본적인 컴포넌트로 제공되는 컴포넌트로써 상당히 강력한 레포팅기능을 지원한다. 간단한 한페이지의 문서부터 다양한 형태의 그래프를 출력하는 레포트까지 쓰임새가 다양하다.

 

l       QuickReport컴포넌트

해당 Report 출력하려면 다음과 같습니다.

.QuickRep.Print;

.QuickRep.PreView; // 미리보기

 


컴포넌트는 Qreport 가장 기본적인 컴포넌트로 델파이의 폼을 레포트로 전환하여 줍니다. Report Setting 살펴보면 여러가지 기본적인 정보와 읽어낼 있는 프로퍼티를 확인할 있습니다.

 

l       참고

델파이의 QReport 도트프린터나 A4이외의 종이인경우 오동작하는 경우가 많았습니다. 해당 기종의 테스트를확인하신후에 출력이 정상적으로 이루어질 경우에 QReport 사용하시는 것이 좋습니다.

 

퀵레포트에서 자주사용되는 프로퍼티는 다음과 같다.

 

프로퍼티

내용

PageCount

출력되는 전체 페이지수

PageNumber

현재 출력되는 페이지번호

RecordNo

사용중인 레코드 번호

PageFrame

페이지의 여백

PaperSize

용지의 크기

ReportTitle

레포트의 제목

Orientation

출력방향 poPortait(세로), poLandscape(가로)

ShowProgress

출력진행상태 Progreee표시유무

PaperWidth

용지의

PaperLength

용지의 길이

Columns

컬럼의

 

이외에 Band 프로퍼티는 다음과 같다.

프로퍼티

내용

HasColumnHeader

각페이지에 Column부분을 사용한다

HasDetail

테이블의 정보를 모두 출력

HasPageFooter

아래 출력내용 설정

HasPageHeader

출력내용 설정

HasSummery

리포트끝에 한번만 출력

HasTime

보고서 시작부에 한번만 출력

 

l       QRBand

 

QRBand QReport에서 가장 많이 사용되는 Band 프로퍼티중에 BendType부분의 값을 조절함으로써 출력되는 곳의 위치를 지정할 있도록 한다.

 

프로퍼티

내용

ForceNewColumn

출력전에 새로운 열을 만든다

ForceNewPage

출력전에 새로운 페이지를 만든다

LinkBand

여러 개의 밴드를 페이지에 출력시에 일정한 여백을 갖도록 하고, 공간이 충분하면 링크된 밴드가 이어서 출력되게 한다. , 공간이 부족하면 새로운 라인에 출력한다.

hasChild

True시에 자동으로 Child 나타난다.

Frame

테두리의 사각형의 선을 그릴것인지 결정한다.

 

BandType

속성

내용

rbChild

다른밴드가 연결되어 있으면 연결된 밴드를 먼저출력하고 나중에 출력

rbColumnHeader

페이지의 윗부분에 나오게 한다

rbDetail

테이블 정보가 모두 출력

rbGroupFooter

테이블 정보 맨끝에 한번 출력

rbGroupHeader

테이블 정보 처음 한번 출력

rbOverlay

페이지 왼쪽 상단부터 출력

rbPageFooter

페이지 아래 출력

rbPageHeader

페이지 위에 출력

rbSubDatail

master/detail부분의 detail부분에 사용

rbSummary

마지막에 한번 합계 경우에 사용

rbTitle

시작부분에 한번 수행

 

 

 

l       QRSysData 컴포넌트

보통 레포트 출력시에 시간, 날짜등의 내용을 출력하는 컴포넌트. Data프로퍼티를 조절하면 다양한 속성을 사용할 있습니다.


qrsDate( 시스템 날짜, yy-mm-dd ), qrsDateTime( 날짜+시간출력 ), qrsDetailNo( 현재의 레코드번호 ), qrsPageNumber( 현재 출력 페이지 번호 ), qrsDetailCount( 출력될 레코드수 ), qrsReportTitle( 리포트의 제목으로 Qrerport ReportTitle 프로퍼티사용), qrsTime( 출력시의 시간설정 )

 

Text 들어 있는 내용은 Data에서 정의된 내용을 출력하기 전에 먼저 찍고, Data 프로퍼티에서 설정된 내용을 출력합니다.

 

l       QRGroup 컴포넌트

Report에서 마스터/디테일 형태의 레포트를 만드는 경우에 사용하는데

해당 프로퍼티를 참고하여 보면 FooterBand, HasChild, Master등의 프로퍼티가 눈에 띈다.  Master 프로퍼티의 내용을 받아와서 Footerband 만들어준다. 이때에 Expression 프로퍼
티를 참고하여 보면,

원하는 DataSet 필드에서 Function 거쳐서 값을 산출할 있다.

 

l       QRDB, QRLABEL 컴포넌트

 

QRLABEL 프린트되는 QReport 원하는 내용을 입력할 있는 Label이라고 생각하면 된다, QRDB DBLabel 동일하다, 해당 Band위에 올려놓고 DataSet Fields 연결하면 해당 내용을 보여준다.

 

l      
QRPreview

QReport 기본적인 Preview화면을 지원한다, 하지만 영문으로 나오고 모양이 그리 이쁘지 않다 이러한 Preview화면을 조정할 있다. 이런 지원은 QRPreview컴포넌트를 사용한다. 만들어진 Preview화면을 사용하려면 QRPreview Form으로 만들어진 화면을 등록하면 사용할 있다.

신고
Posted by 나비 나비:D

BLOG main image
by 나비:D

공지사항

카테고리

분류 전체보기 (278)
Programming? (0)
----------------------------- (0)
나비의삽질 (5)
Application (177)
SQL (51)
Web (27)
etc. (14)
Omnia (0)
---------------------------.. (0)

글 보관함

달력

«   2017/08   »
    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 31    
Total : 870,086
Today : 41 Yesterday : 412