Migrating Borland® Database Engine Applications to dbExpress

Similar documents
PowerPoint Template

아이콘의 정의 본 사용자 설명서에서는 다음 아이콘을 사용합니다. 참고 참고는 발생할 수 있는 상황에 대처하는 방법을 알려 주거나 다른 기능과 함께 작동하는 방법에 대한 요령을 제공합니다. 상표 Brother 로고는 Brother Industries, Ltd.의 등록 상

Windows 8에서 BioStar 1 설치하기

DBMS & SQL Server Installation Database Laboratory

문서 템플릿

View Licenses and Services (customer)

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

Windows Server 2012

±×¸°¸®Æ÷Æ® ³»Áö5Â÷

JDBC 소개및설치 Database Laboratory

<4D F736F F F696E74202D203137C0E55FBFACBDC0B9AEC1A6BCD6B7E7BCC72E707074>

MF Driver Installation Guide

2 노드

쉽게 풀어쓴 C 프로그래밊

Microsoft PowerPoint - 10Àå.ppt

ThinkVantage Fingerprint Software

InsertColumnNonNullableError(#colName) 에해당하는메시지출력 존재하지않는컬럼에값을삽입하려고할경우, InsertColumnExistenceError(#colName) 에해당하는메시지출력 실행결과가 primary key 제약에위배된다면, Ins

WINDOW FUNCTION 의이해와활용방법 엑셈컨설팅본부 / DB 컨설팅팀정동기 개요 Window Function 이란행과행간의관계를쉽게정의할수있도록만든함수이다. 윈도우함수를활용하면복잡한 SQL 들을하나의 SQL 문장으로변경할수있으며반복적으로 ACCESS 하는비효율역

Spring Boot/JDBC JdbcTemplate/CRUD 예제

IRISCard Anywhere 5

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

vRealize Automation용 VMware Remote Console - VMware

[Brochure] KOR_TunA

Vol.266 C O N T E N T S M O N T H L Y P U B L I C F I N A N C E F O R U M

ISP and CodeVisionAVR C Compiler.hwp

사용설명서를 읽기 전에 안드로이드(Android)용 아이디스 모바일은 네트워크 연결을 통해 안드로이드 플랫폼 기반의 모바일 기기에서 장치 (DVR, NVR, 네트워크 비디오 서버, 네트워크 카메라) 에 접속하여 원격으로 영상을 감시할 수 있는 프로그램입니다. 장치의 사

API - Notification 메크로를통하여어느특정상황이되었을때 SolidWorks 및보낸경로를통하여알림메시지를보낼수있습니다. 이번기술자료에서는메크로에서이벤트처리기를통하여진행할예정이며, 메크로에서작업을수행하는데유용할것입니다. 알림이벤트핸들러는응용프로그램구현하는데있어

SQL Developer Connect to TimesTen 유니원아이앤씨 DB 기술지원팀 2010 년 07 월 28 일 문서정보 프로젝트명 SQL Developer Connect to TimesTen 서브시스템명 버전 1.0 문서명 작성일 작성자

목차 1. 시스템요구사항 암호및힌트설정 ( 윈도우 ) JetFlash Vault 시작하기 ( 윈도우 ) JetFlash Vault 옵션 ( 윈도우 )... 9 JetFlash Vault 설정... 9 JetFlash Vault

13주-14주proc.PDF

사용설명서를 읽기 전에 ios용 아이디스 모바일은 네트워크 연결을 통해 ios 플랫폼 기반의 모바일 기기(iOS 버전 6.0 이상의 ipod Touch, iphone 또는 ipad)에서 장치(DVR, 네트워크 비디오 서버 및 네트워크 카메라)에 접속하여 원격으로 영상을

슬라이드 제목 없음

Microsoft Word - src.doc

슬라이드 1

SBR-100S User Manual

경우 1) 80GB( 원본 ) => 2TB( 복사본 ), 원본 80GB 는 MBR 로디스크초기화하고 NTFS 로포맷한경우 복사본 HDD 도 MBR 로디스크초기화되고 80GB 만큼포맷되고나머지영역 (80GB~ 나머지부분 ) 은할당되지않음 으로나온다. A. Window P

< 목차 > Ⅰ. 개요 3 Ⅱ. 실시간스팸차단리스트 (RBL) ( 간편설정 ) 4 1. 메일서버 (Exchange Server 2007) 설정변경 4 2. 스팸차단테스트 10

윈도우시스템프로그래밍

Microsoft PowerPoint - 3장-MS SQL Server.ppt [호환 모드]

1. Windows 설치 (Client 설치 ) 원하는위치에다운받은발송클라이언트압축파일을해제합니다. Step 2. /conf/config.xml 파일수정 conf 폴더에서 config.xml 파일을텍스트에디터를이용하여 Open 합니다. config.xml 파일에서, 아


MySQL-.. 1

5장 SQL 언어 Part II

RHEV 2.2 인증서 만료 확인 및 갱신

Bind Peeking 한계에따른 Adaptive Cursor Sharing 등장 엑셈컨설팅본부 /DB 컨설팅팀김철환 Bind Peeking 의한계 SQL 이최초실행되면 3 단계의과정을거치게되는데 Parsing 단계를거쳐 Execute 하고 Fetch 의과정을통해데이터

PowerPoint 프레젠테이션

PowerPoint Presentation

슬라이드 제목 없음

빅데이터분산컴퓨팅-5-수정

Main Title

목차 윈도우드라이버 1. 매뉴얼안내 운영체제 (OS) 환경 윈도우드라이버준비 윈도우드라이버설치 Windows XP/Server 2003 에서설치 Serial 또는 Parallel 포트의경우.

Data Sync Manager(DSM) Example Guide Data Sync Manager (DSM) Example Guide DSM Copyright 2003 Ari System, Inc. All Rights reserved. Data Sync Manager

PowerPoint Presentation

Microsoft Word - windows server 2003 수동설치_non pro support_.doc

단답형 (26 회기출문제 ) 1. 아래와같은테이블이있을때아래의 SQL 결과에대해서 Oracle, SQL Server 순서로적으시오 TAB1 COL1 CHAR(10) COL2 CHAR(10) INSERT INTO TAB1 VALUES ('1',''); INSERT INT

Microsoft PowerPoint - e pptx

소프트웨어공학 Tutorial #2: StarUML Eun Man Choi

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

강의 개요

설계란 무엇인가?

Microsoft PowerPoint - chap06-2pointer.ppt

목차 BUG 문법에맞지않는질의문수행시, 에러메시지에질의문의일부만보여주는문제를수정합니다... 3 BUG ROUND, TRUNC 함수에서 DATE 포맷 IW 를추가지원합니다... 5 BUG ROLLUP/CUBE 절을포함하는질의는 SUBQUE

arcplan Enterprise 6 Charting Facelifts

User Guide

歯sql_tuning2

한국어교재_중급1-앞-인쇄용.indd

Microsoft PowerPoint Python-DB

다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL

BY-FDP-4-70.hwp

목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4

설치 순서 Windows 98 SE/Me/2000/XP 1 PC를 켜고 Windows를 시작합니다. 아직 컴퓨터에 프린터를 연결하지 마십시오. 2 PC에 P-S100 CD-ROM(프 린터 드라이버)을 삽입합니다. 3 설치 프로그램을 시작합니다. q CD-ROM의 PS1

. 스레드 (Thread) 란? 스레드를설명하기전에이글에서언급되는용어들에대하여알아보도록하겠습니다. - 응용프로그램 ( Application ) 사용자에게특정서비스를제공할목적으로구현된응용프로그램을말합니다. - 컴포넌트 ( component ) 어플리케이션을구성하는기능별요

Microsoft Word - Armjtag_문서1.doc

<C1A62038B0AD20B0ADC0C7B3EBC6AE2E687770>

Endpoint Protector - Active Directory Deployment Guide

제이쿼리 (JQuery) 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호

PowerPoint 프레젠테이션

chap 5: Trees

Studuino소프트웨어 설치

ActFax 4.31 Local Privilege Escalation Exploit

IP 심화 라우팅프로토콜적용시 라우팅테이블에서 이니셜이있는네트워크를설정하는것 : onnected 직접연결된네트워크를의미한다. 그러므로라우팅은 나는이런네트워크와연결되어있다. 를직접연결된라우터들에게알려주는것 1>en 1#conf t 1(config)#router rip 1

Security.hwp

기획7.hwp

API STORE 키발급및 API 사용가이드 Document Information 문서명 : API STORE 언어별 Client 사용가이드작성자 : 작성일 : 업무영역 : 버전 : 1 st Draft. 서브시스템 : 문서번호 : 단계 : Docum


CODESYS 런타임 설치과정

Microsoft Word - release note-VRRP_Korean.doc

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint Android-SDK설치.HelloAndroid(1.0h).pptx

- JPA를사용하는경우의스프링설정파일에다음을기술한다. <bean id="entitymanagerfactory" class="org.springframework.orm.jpa.localentitymanagerfactorybean" p:persistenceunitname=

이도경, 최덕재 Dokyeong Lee, Deokjai Choi 1. 서론

[<1107><1169><11AB><1106><116E><11AB>] 2015<1102><1167><11AB> 7<110B><116F><11AF><1112><1169>-<110E><116C><110C><1169><11BC>.pdf

System Recovery 사용자 매뉴얼

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

API 매뉴얼

Tablespace On-Offline 테이블스페이스 온라인/오프라인

Microsoft PowerPoint - chap01-C언어개요.pptx

CH04) 쿼리 (Query) 데이터베이스일반 1- 쿼리 (Query) 1) 쿼리의개념 테이블의데이터에서사용자가원하는조건에의해필드를추출하거나레코드를추출할수있는개체로즉, 여러가지방법으로데이터를보고, 변경하고, 분석할수있음 쿼리를폼, 보고서, 데이터액세스페이지등의레코드원본

윈도우시스템프로그래밍

Result Cache 동작원리및활용방안 엑셈컨설팅본부 /DB 컨설팅팀김철환 개요 ORACLE DBMS 를사용하는시스템에서 QUERY 성능은무엇보다중요한요소중하나이며그 성능과직접적인관련이있는것이 I/O 이다. 많은건수를 ACCESS 해야만원하는결과값을얻을수있는 QUER

Transcription:

BDE 애플리케이션을 dbexpress 로마이그레이션하기 provide/resolve 구조를사용하는새로운접근방식 Bill Todd (The Database Group, Inc. 사장 ) 볼랜드 Software Coporation 2002 년 9 월 목차 볼랜드 dbexpress- 새로운비전 1 dbexpress 구조 1 provide/resolve 구조의동작방식 2 dbexpress 애플리케이션개발 3 BDE 와 dbexpress 의비교 12 BDE SQL Links 애플리케이션을 dbexpress 로마이그레이션하기 로컬데이터베이스애플리케이션을 dbexpress 로마이그레이션하기 12 15 요약 17 저자소개 17 볼랜드 dbexpress- 새로운비전 여러데이터베이스를지원하기위한공통 API 를 생성하려는시도는몇가지의문제점을가지고있습니다. 어떤방식은너무많은것을지원하기때문에크고느리고 배포에어려움이있었습니다. 다른방식은최소한의공통 요소만을제공한때문에개발자들이일부데이터베이스의 특정기능을이용할수없었습니다. 또다른방식은 드라이버작성의복잡성때문에제한된기능을제공하거나 속도가느리거나버그를가지고있었습니다. 볼랜드 dbexpress 는여러데이터베이스의공통 API 제공을위한 새로운접근방식과, 데이터편집및수정작업을관리하는 볼랜드의입증된 provide/resolve 구조를이용하여이문제를 해결했습니다. 이글에서는 dbexpress 와 provide/resolve 방식의구조를살펴보고, dbexpress 컴포넌트를사용하여 데이터베이스애플리케이션을개발하는방법을보여주고, BDE(Borland Database Engine) 을사용하는데이터베이스 애플리케이션을 dbexpress 로변환하는과정을설명합니다. dbexpress 구조 dbexpress 는다음과같은 6 가지목표를충족시키도록 설계되었습니다. 크기와시스템리소스사용량의최소화 속도최대화 크로스플랫폼지원제공 더쉬운배포 쉬운드라이버개발 메모리사용과네트워크트래픽에대한개발자의 제어능력확대

dbexpress 드라이버는기능이극히제한되어있기때문에작고빠릅니다. 각드라이버는윈도우플랫폼상의단일 DLL인동시에리눅스플랫폼상의단일 Shared Object 라이브러리로서구현되어있습니다. dbexpress 드라이버는메타데이터페치, SQL 명령및프로시져의실행, 읽기전용단방향커서반환을위한 5개의인터페이스를구현하고있습니다. 그러나, 볼랜드의 provide/resolve데이터액세스전략에따라 DataSetProvider 및 ClientDataSet와함께사용하는경우 dbexpress는 SQL 데이터베이스에있는데이터로작업할수있는모든기능, 고성능, 높은병행성에있어서최적화된성능을발휘합니다. provide/resolve 구조의동작방식 provide/resolve구조는 4개의컴포넌트를사용하여데이터를액세스하고편집합니다. 첫번째는 SQLConnection 컴포넌트로서, 사용할데이터베이스에대한 dbexpress 드라이버에연결합니다. 다음은 dbexpress 데이터셋컴포넌트가운데하나로, SQL SELECT 문장을실행하거나스토어드프로시저를호출한결과데이터를전달합니다. 세번째컴포넌트는 DataSetProvider이고, 네번째는 ClientDataSet입니다. ClientDataSet를열면 DataSetProvider에데이터를요청하게됩니다. DataSetProvider는쿼리또는스토어드프로시저컴포넌트를열고레코드를읽어온후에쿼리혹은스토어드프로시저컴포넌트를닫고필요한메타데이터와함께레코드들을 ClientDataSet에전달합니다. ClientDataSet은레코드들을조회또는수정되는동안이들을메모리에보유하고있습니다. 레코드가코드또는유저인터페이스를통하여추가, 삭제또는수정되면 ClientDataSet이모든변경사항을메모리에기록합니다. 데이터베이스를갱신하려면 ClientDataSet의 ApplyUpdates 메소드를호출합니다. ApplyUpdates는변경기록을 DataSetProvider로전송합니다. 프로바이더는트랜잭션을시작하고데이터베이스에변경사항을적용하기위한 SQL 문을생성하여실행합니다. 모든변경사항이성공적으로적용되면프로바이더는트랜잭션을커밋합니다. 그렇지않은경우트랜잭션은롤백됩니다. 데이터베이스갱신은변경사항이비즈니스규칙을위반하는것이거나다른사용자가갱신하려는레코드를변경하였거나하는경우에는실행되지않습니다. 오류가발생하면트랜잭션은 취소되고 ClientDataSet의 OnReconcileError 이벤트가발생하여사용자가오류를처리하도록합니다. provide/resolve 구조의이점 짧은트랜잭션시간긴트랜잭션은데이터베이스서버가락을유지하도록하여동시성을감소시키고데이터베이스서버의리소스를소모합니다. provide/resolve구조에서는갱신의적용순간에만트랜잭션이존재하므로, 리소스소모를현저하게낮추고혼잡한데이터베이스서버의동시성을향상시킵니다. 모든행의편집가능다중테이블조인, 스토어드프로시저또는읽기전용뷰에서는행을직접편집할수없습니다. 필드객체의 ProviderFlags 속성을사용하여갱신할필드를식별하고 DataSetProvider의 OnGetTableName 이벤트를사용하여테이블의이름을제공하면많은읽기전용데이터셋을쉽게편집할수있습니다. 즉시적인정렬및탐색 ClientDataSet은레코드들을메모리에가지고있으므로정렬이빠릅니다. 메모리내의정렬이너무느리면디자인타임이나런타임에서 ClientDataSet 데이터에인덱스를만들수있습니다. 이런메모리인덱스를이용하면데이터베이스에인덱스를유지하는오버헤드없이즉시레코드의보기순서를변경하거나레코드를찾아갈수있습니다. 자동요약정보 ClientDataSet은 Sum(Price)-Sum(Cost) 와같이사용자가정의한복잡한합계산을자동으로보존합니다. 합계산을필드별또는필드의결합으로그룹하여그룹합계를구할수있습니다. 또한, Min, Max, Count 및 Avg ( 평균 ) 합계를사용할수있습니다. 데이터서브셋뷰 SQL WHERE 구문에서필터표현을사용하면데이터베이스서버에서추가로쿼리를실행하지않고도 ClientDataSet에있는레코드의서브셋을쉽게표시할수있습니다.

다중동시데이터뷰 ClientDataSet 커서를복제하는기능으로 ClientDataSet에있는데이터의여러서브셋을동시에볼수있습니다. 또한동일데이터를다르게정렬하여볼수도있습니다. 서버에부하를주지않는계산필드디자인타임에 ClientDataSet에계산필드를추가하여계산필드를메모리데이터셋의부분으로만들수있습니다. 계산은컴파일된델파이또는 C++ 언어코드로실행되므로, SQL 문안에있는계산된컬럼이나스토어드프로시저안의계산보다더빠르고훨씬더복잡해질수있으면서도데이터베이스서버에저장공간이나계산부담을주지않습니다. 실질적으로제한이없음메모리에레코드들을보유함으로해서작업할수있는레코드수에제한이따를것처럼느껴질수있습니다. 그러나, 전통적인클라이언트 / 서버애플리케이션디자인에서는네트워크트래픽과데이터베이스서버의부하를최소화하기위해작은레코드셋만을셀렉트해왔다는점을상기해보십시오. 예외적으로많은레코드들을작업해야하는경우라도, 각각 100바이트를가지는 10,000개의레코드의경우단지 1MB의메모리만을필요로합니다. 대단히많은수의레코드로작업해야하는드문경우라도, ClientDataSet와 DataSetProvider에는레코드의일부를가져와서편집하고메모리에서제거한후에다음레코드그룹을가져오는속성및이벤트들이포함되어있습니다. 더욱용이한배포 dbexpress를사용하는애플리케이션은단지두개의 DLL만을필요로합니다. 하나는 dbexpress 드라이버이며 ( 예를들어볼랜드 InterBase의경우 DBEXPINT.DLL), 다른하나는 ClientDataSet 지원라이브러리인 MIDAS.DLL입니다. 이두개의 DLL은합쳐도크기가 0.5 MB 미만입니다. 따라서애플리케이션의크기를최소화할수있고설치가간단합니다. 이들 DLL들을배포하는것이마음에들지않는다면 EXE에직접컴파일하여포함시킬수도있습니다. 리눅스에서의배포도 DLL 대신에두개의 shared object 라이브러리를사용한다는점을제외하고는동일합니다. 더쉬운드라이버개발 dbexpress 드라이버는온라인헬프에설명된 5개의인터페이스를구현해야합니다. 볼랜드는모델로서 MySQL 드라이버의소스코드를제공합니다. 이를참조하면데이터베이스판매회사는강력한고성능드라이버를쉽게만들수있습니다. 잘사용되어지지않거나오래된데이터베이스로작업하는경우상업적으로구입할수있는드라이버가없는경우, 드라이버를직접만들어사용할수도있습니다. dbexpress 애플리케이션개발 기존의 BDE 애플리케이션을 dbexpress로변환하기이전에 dbexpress 컴포넌트의사용방법을잘알아야합니다. 여기에서는 dbexpress 애플리케이션을단계별로생성하면서각컴포넌트에대하여설명하겠습니다. 이예는윈도우플랫폼에서볼랜드 Delphi를사용하여개발하는것이지만윈도우에서 C++Builder로개발하는경우, 그리고리눅스플랫폼에서볼랜드 Kylix를사용하는절차도이와동일합니다. 샘플애플리케이션은 InterBase 샘플 EMPLOYEE.GDB 데이터베이스를사용하며, Employee 테이블과 Salary History 테이블사이에는일대다관계가있습니다. 샘플애플리케이션은다음과같은 dbexpress의기능을보여줍니다. 마스터테이블의필드에디테일테이블을포함시키기 SQLQuery, DataSetProvider 및 ClientDataSet 컴포넌트를이용하여데이터편집하기 DataSetProvider와 ClientDataSet 없이 SQLQuery를읽기전용데이터셋으로사용하기 ClientDataSet의수정사항을데이터베이스에적용하기 수정사항을데이터베이스에적용할때발생하는오류처리하기 SQLConnection 컴포넌트 간단한 dbexpress 애플리케이션을생성하려면다음절차에따릅니다.

1. 새애플리케이션을생성한후에데이터모듈을추가합니다. 데이터모듈의이름을 MainDm로정합니다. 2. Project Options 다이얼로그를사용하여메인폼이생성되기전에데이터모듈이자동으로생성되도록합니다. 3. SQLConnection 컴포넌트 ( 컴포넌트팔레트의 dbexpress 페이지 ) 를데이터모듈에놓습니다. 4. SQLConnection 컴포넌트의이름을 EmployeeConnection 이라고정하고 DriverName 속성을 InterBase로설정합니다. 5. Params 속성의속성에디터를열고 Database 파라미터를샘플 InterBase 데이터베이스인 EMPLOYEE.GDB의경로로설정합니다. 디폴트로설치했다면 c:\program files\borland \interbase\examples\database\employee.gdb 일것입니다. 6. InterBase 서버에연결하기위하여다른값이필요하다면, UserName과 Password 매개변수를변경합니다. 7. LoginPrompt 속성을 false로설정하여프로그램을실행할때마다사용자이름과비밀번호를입력하지않게합니다. 8. Connected 속성을 true로설정하여연결상태를테스트한후에다시 false로설정합니다. SQLConnection 컴포넌트는여러개의데이터셋컴포넌트에대해서데이터베이스연결을제공합니다. 많은데이터베이스에동시에연결할경우에는여러개의 SQLConnection 컴포넌트를사용할수있습니다. 데이터베이스에대한연결을정의하는방법은세가지가있습니다. 이전에이름을붙였던연결을사용하거나, 새로운이름의연결을생성하거나, SQLConnection 컴포넌트의 Params 속성에연결파라미터를넣는방법이있습니다. 기존의연결이름을사용하려면 ConnectionName 속성에지정하면됩니다. dbexpress 커넥션에디터새로운연결이름을생성하려면 SQLConnection 컴포넌트를더블클릭하여 dbexpress 커넥션에디터를 엽니다. 왼쪽에있는 Connection Name 리스트박스에이미정의된연결들이나열됩니다. Driver 드롭다운리스트에서 Connection Names를필터링하여선택한드라이버에대한연결만표시할수도있습니다. 오른쪽에있는 Connection Settings 그리드는선택한연결에대한연결설정을표시합니다. 생성한모든연결은 dbxconnections.ini 파일에저장됩니다. 커넥션에디터연결파일연결이름을생성한후에는 SQLConnection의 ConnectionName 속성에이를지정할수있습니다. 연결이름을사용하는경우배포할때애플리케이션과함께연결파일을배포하거나, 대상컴퓨터에서기존의연결파일을찾아서연결이름을추가해야합니다. SQLConnection 컴포넌트의 Params 속성 SQLConnection 컴포넌트의 DriverName 속성을설정하는또다른방법이있습니다. DriverName 속성의드롭다운리스트에는시스템에설치되어있는모든드라이버를보여줍니다. 드라이버정보는 dbxdrivers.ini 파일에들어있습니다. DriverName 속성을설정하면드라이버파일에들어있는정보를이용하여 LibraryName와 VendorLib 속성도같이설정됩니다. LibraryName에는 dbexpress 드라이버 DLL의이름이들어있고, VendorLib에는데이터베이스판매회사의클라이언트라이브러리파일이들어있습니다.

앞의화면과같이 SQLConnection 컴포넌트의 Params 속성에커넥션에디터의연결매개변수를입력합니다. 이방법을사용하면연결정보가모두애플리케이션에포함됩니다. 애플리케이션사용자가연결파라미터를변경할수있도록하려면애플리케이션자체의설정파일에이를저장하고애플리케이션내부에서또는별도의설정프로그램을이용하여파일을편집하는방법을알려줄수있습니다. 이렇게하면각애플리케이션이모든것을완전하게갖추게됩니다. 또한, SQLConnection 컴포넌트는트랜잭션제어를위한 StartTransaction, Commit 및 Rollback 메소드를제공합니다. 결과를반환하지않는 SQL 문장을실행하는경우에는 SQLConnection 컴포넌트의 Execute 또는 ExecuteDirect 메소드를사용할수있으며, 데이터셋컴포넌트는필요하지않습니다. 작업하고있는데이터베이스의메타데이터를액세스해야하는경우 SQLConnection의 GetTableNames, GetFieldNames 및 GetIndexNames 메소드를이용할수있습니다. 문장의경우에는 SQLQuery에서 Open 메소드를호출하거나 Active 속성을 true로설정합니다. 커서를반환하지않는문장의경우에는 ExecSQL 메소드를호출합니다. 다음과같이샘플애플리케이션의구축을계속합니다. 1. 3개의 SQLQuery 컴포넌트를데이터모듈에끌어다놓습니다. 2. 세컴포넌트의 SQLConnection 속성을모두 EmployeeConnection로설정합니다. 3. 각각의이름을 EmployeeQry, HistoryQry 및 DeptQry로정합니다. 4. EmployeeQry의 SQL 속성을다음과같이설정합니다. SELECT * FROM EMPLOYEE WHERE DEPT_NO = :DEPT_NO ORDER BY LAST_NAME 5. HistoryQry의 SQL 속성을다음과같이설정합니다. SELECT * FROM SALARY_HISTORY WHERE EMP_NO = :EMP_NO 데이터셋컴포넌트 dbexpress는 SQLDataSet, SQLQuery, SQLStoredProc 및 SQLTable의네가지데이터셋컴포넌트를제공합니다. SQLDataSet은새로운애플리케이션을작성할때선택하는컴포넌트입니다. CommandType 속성을설정하면 SQL 문장을실행하고, 스토어드프로시저를호출하거나테이블에있는모든행과열에액세스할수있습니다. 나머지데이터셋컴포넌트들은각각의 BDE 해당컴포넌트들과가급적비슷하게디자인되어있습니다. 이러한컴포넌트를사용하면 BDE 애플리케이션을 dbexpress로쉽게변환할수있습니다. SQLQuery SQLQuery 컴포넌트의속성과메소드는 BDE Query 컴포넌트와아주흡사합니다. SQLQuery는읽기전용의단방향결과세트를반환하므로 BDE에관련된메소드 / 속성이나편집에관련된속성 / 메소드는없습니다. SQLQuery는 DML과 DDL 양쪽모두의 SQL을실행하기위해사용될수있습니다. 결과셋에커서를반환하는 6. DeptQry의 SQL 속성을다음과같이설정합니다. SELECT DEPT_NO, DEPARTMENT FROM DEPARTMENT ORDER BY DEPARTMENT 7. DataSource 하나를데이터모듈에떨어뜨리고, 이름을 EmpLinkSrc로정한후에 DataSet 속성을 EmployeeQry로설정합니다. 8. HistoryQry의 DataSource 속성을 EmpLinkSrc로설정합니다. 9. EmployeeQry로되돌아가서 Params 속성편집기를열고 DEPT_NO 매개변수의값을 XXX로설정합니다. 이것은잘못된값이므로사용자가올바른부서번호를입력할때까지아무레코드도표시되지않습니다. 10. EmployeeQry를더블클릭하여필드에디터를열고모든필드에대하여필드객체를추가합니다. 11. EMP_NO 필드를선택하여 ProviderFlags 속성을확장한후에 pfinkey를 true로설정합니다. pfinkey

플래그를 true로설정하면 EMP_NO 필드가기본키로인식됩니다. SQL 문장이변경사항을데이터베이스에적용하도록구성하려면 DataSetProvider( 나중에추가 ) 가이정보를알아야합니다. 12. FULL_NAME 필드를선택하여 ProfiderFlags 속성을확장한후에 pfinupdate와 pfinwhere를 false로설정합니다. FULL_NAME은계산필드이므로 DataSetProvider에의하여생성되는 SQL 문장의 WHERE 절에포함되거나갱신되지않아야합니다. 13. EmployeeQry의 Active 속성을 true로설정합니다. 14. HistoryQry를더블클릭하여 Fields Editor를열고모든필드객체를추가합니다. 15. Fields Editor에서 EMP_NO 필드를선택한후에 ProviderFlags 속성에서 pfinkey를 true로설정합니다. 이과정을주키의일부인 CHANGE_DATE와 UPDATER_ID 필드에대하여반복합니다. 16. NEW_SALARY 필드도계산되는필드이므로이것을선택하여 pfinupdate와 pfinwhere 프로바이더플래그를 false로설정합니다. 17. EmployeeQry와 HistoryQry의 Active 속성을 false로설정합니다. 18. EmployeeConnection의 Connected 속성을 false로설정합니다. SQLTable SQLTable 컴포넌트는 BDE의 Table 컴포넌트와비슷합니다. BDE에서와같이테이블에있는모든행과열을반환합니다. 그렇기때문에클라이언트 / 서버애플리케이션에알맞은방법은아닙니다. 이것의유일한장점은 BDE Table 컴포넌트를사용하는로컬데이터베이스애플리케이션을 dbexpress와데이터베이스서버로빠르게변환하는데에있습니다. SQLTable을사용하려면 SQLConnection 속성을 SQLConnection 컴포넌트로설정합니다. TableName 속성을액세스하고자하는테이블의이름으로설정합니다. Active 속성을 true로설정하거나 Open 메소드를호출하여테이블을엽니다. SQLStoredProc BDE 애플리케이션에서 BDE StoredProc 컴포넌트를사용한것과같은방법으로 SQLStoredProc 컴포넌트를사용하여스토어드프로시저를호출합니다. SQLDataSet 컴포넌트를사용하여스토어드프로시저를호출할수도있으나, SQLStoredProc 컴포넌트는 BDE StoredProc 컴포넌트와거의같기때문에이것을사용하여 BDE 애플리케이션을전환하는것이더쉽습니다. SQLStoredProc를사용하려면 SQLConnection 속성을 SQLConnection 컴포넌트로설정하고, StoredProcName 속성을실행하고자하는스토어드프로시저의이름으로설정합니다. 스토어드프로시저가레코드들에대한커서를반환하는경우에는 SQLStoredProc의 Active 속성을 true로설정하거나 Open 메소드를호출하여실행합니다. 스토어드프로시저가결과셋에대한커서를반송하지않으면 ExecProc 메소드를호출하여실행합니다. SQLDataSet SQLDataSet를사용하려면 SQLConnection 속성을사용하고자하는 SQLConnection 컴포넌트로설정합니다. 다음으로, CommandType 속성을 ctquery, ctstoredproc 또는 cttable에설정합니다. 대개의경우기본값인 ctquery을사용하게됩니다. CommandText 속성의값은 CommandType의값에따라다릅니다. CommandType이 ctquery인경우, CommandText는실행할 SQL 문을포함합니다. CommandType이 ctstoredproc인경우, CommandText는스토어드프로시저의이름입니다. CommandType이 cttable인경우, CommandText는테이블의이름입니다. Params 속성을사용하여 파라미터화된 쿼리또는스토어드프로시저에대한파라미터를제공하고, DataSource 속성을사용하여 SQLDataSet을마스터 / 디테일관계에있는다른데이터셋컴포넌트에연결합니다. SQLDataSet가레코드셋에대한커서를반환하는경우에는 Open 메소드를호출하거나 Active 속성을 true로설정하여엽니다. 만일결과셋을반송하지않으면 ExecSQL 메소드를호출합니다. SQLDataSet는읽기전용의단방향커서만을제공합니다. 리포트인쇄등에서처럼이것이필요한유일한액세스라면

레포트툴의요구사항에따라 SQLDataSet만을사용하거나 DataSource 컴포넌트와함께사용할수있습니다. 레코드안을앞혹은뒤로이동하거나데이터를편집해야하는경우에는 DataSetProvider와 ClientDataSet를추가하거나이문서에서다음에설명할 SimpleDataSet 컴포넌트를사용합니다. SQLConnection의메소드들이제공하는정보이상의자세한메타데이터정보가필요한경우에는 SQLDataSet 컴포넌트의 SetSchemaInfo 메소드를이용합니다. SetSchemaInfo는 SchemaType, SchemaObject 및 SchemaPattern 의세가지파라미터를가집니다. SchemaType은 stnone, sttables, stsystables, stprocedures, stcolumns, stprocedureparams, stindexes 가운데하나일수있습니다. 이파라미터는 SQLDataSet가열렸을때포함되는정보의종류를표시합니다. SQL 문장이나스토어드프로시저를사용하여테이블에서정보를추출할때스키마종류는 stnone로설정됩니다. 다른스키마종류들은각각반환되는정보에적절한구조에맞춰데이터셋을생성합니다. SchemaObject는스토어드프로시저또는테이블이름이필요한경우의그이름입니다. SchemaPattern은결과셋을필터링할 SQL 패턴을제공합니다. 예를들어, SchemaType이테이블이고 SchemaPattern이 EMP% 인경우데이터셋은 EMP로시작하는테이블만포함합니다. SimpleDataSet BDE을사용하여레코드를보고편집하려면 TQuery를데이터모듈에끌어다놓고두가지속성을설정하면됩니다. dbexpress의경우에는 SQLQuery 또는 SQLDataSet와 DataSetProvider, ClientDataSet를데이터모듈에끌어다놓고속성을설정하여이들을함께연결시킵니다. 세가지컴포넌트를추가하고속성을설정하는추가적인시간을절약하는두가지방법이있습니다. 볼랜드 Delphi 7 Studio에는 SimpleDataSet 컴포넌트가도입되었습니다. 이 SimpleDataSet은 SQLDataSet, DataSetProvider 및 ClientDataSet를하나의컴포넌트로결합한것입니다. 만일단일테이블또는스토어드프로시저로부터레코드를보고편집하는작업만필요한경우 SimpleDataSet이빠른방법입니다. 단지이것을데이터모듈에추가하고 Connection 속성을 SQLConnection 컴포넌트로설정한후내장된 SQLDataSet 컴포넌트의 CommandType과 CommandText 속성을설정하면끝입니다. SimpleDataSet 컴포넌트는약간의제한사항을가지고있습니다. 멀티티어애플리케이션에서는사용할수없습니다. 앞으로애플리케이션을멀티티어로변환해야할가능성이있다면분리된컴포넌트들을사용하십시오. 자식데이터셋을데이터셋필드로 SimpleDataSet에연결할수없습니다. 내부 DataSetProvider의이벤트들이모두노출되지않습니다. 내부 DataSetProvider의 Options 속성이노출되지않습니다. 프로바이더옵션을디자인타임또는런타임에설정할수없습니다. 디자인타임에내부데이터셋에대한필드객체를생성할수없습니다. 이것은디자인타임에필드객체의 ProviderFlags 속성을설정할수없다는것을의미합니다. 이것은코드내에서할수밖에없습니다. ClientDataSet 컴포넌트의내부데이터베이스인볼랜드 MyBase만을사용하고데이터베이스서버에연결하지않는경우에는 ClientDataSet만을사용하게되면애플리케이션의리소스요구를줄일수있습니다. 내부에포함된 SQLDataSet의속성및메소드는 SQLQuery의속성및메소드만큼 BDE Query 컴포넌트의속성과비슷하지않습니다. 그러므로, 프로젝트를변환하는과정에서 SimpleDataSet을사용하면코드변경이더많이필요하게됩니다. SimpleDataSet가제공하는것보다더욱유연성이필요한경우에는 SQLQuery, DataSetProvider, ClientDataSet를폼또는데이터모듈에끌어다놓습니다. SQLQuery의 Connection 속성을설정하고, DataProvider의 DataSet 속성을 SQLQuery에연결하도록설정합니다. ClientDataSet의 ProviderName 속성을 DataSetProvider에연결하도록설정하고, 3개의컴포넌트모두선택한후에메인메뉴에서 Component Create Component Template를선택합니다. 새로운템플릿을위한클래스이름과팔레트페이지를

지정합니다. 이제, 하나의컴포넌트를끌어다놓는것만큼쉽게세개의별개의컴포넌트를데이터모듈에끌어다놓을수있습니다. SQLMonitor DbExpress의마지막컴포넌트인 SQLMonitor는애플리케이션의성능튜닝을도와주기위한컴포넌트입니다. SQLMonitor는 SQLConnection 컴포넌트와이것과연결된데이터베이스서버사이를겨쳐가는모든 SQL 문을체크합니다. SQL 문장은파일에기록되거나, 메모컴포넌트에표시되거나, 기타원하는방법으로처리될수있습니다. 데이터액세스컴포넌트 양방향스크롤과데이터를갱신하는기능이필요한경우, DataSetProvider 및 ClientDataSet 컴포넌트를사용해야합니다. DataSetProvider DataSetProvider는 DataSet 속성을통하여 dbexpress 데이터셋중하나와연결됩니다. DataSetProvider는요청에따라 ClientDataSet에데이터를제공하고, ClientDataSet이제공하는변경로그를이용하여데이터베이스갱신을위한 SQL DML 문장을생성합니다. 샘플애플리케이션을위한데이터모듈로돌아가서, 다음의단계를수행합니다. 1. DataSetProvider( 컴포넌트팔레트의 Data Access 페이지 ) 를추가합니다. 2. DataSet 속성을 EmployeeQry로설정하고, Name 속성을 EmployeeProv로설정합니다. DataSetProvider의 UpdateMode 속성은사용자가갱신하려는레코드를다른사용자가갱신하였는지에대해프로바이더가어떻게판단할지를제어할수있습니다. 프로바이더가데이터베이스를갱신하는 SQL 문장을발생시킬때각 UPDATE와 DELETE 문장에는레코드를식별하기위해 WHERE 절이포함됩니다. 만약 UpdateMode 를 upwhereall로설정하면, 그레코드에속한필드들중 Blob 필드가아니고 pfinwhere 프로바이더플래그가 false가아닌필드의원래값이 WHERE 절에포함됩니다. 이것은다른사람이이필드들중하나라도변경하면 UPDATE 또는 DELETE가실패한다는것을의미합니다. UpdateMode 를 upwherechanged로설정하면변경된필드만이 WHERE 절에포함됩니다. UpdateMode를 upwherekeyonly로설정하면기본키필드만을포함하는 WHERE 절이생성됩니다. 프로바이더의 Options 속성에는 provide/resolve 과정을제어하는여러플래그가포함됩니다. pocascadedeletes 옵션이 true이면삭제한마스터레코드에대한디테일레코드를삭제하기위한 SQL 문장을생성하지않습니다. 프로바이더는데이터베이스서버가연쇄삭제를지원하여자동으로디테일레코드를삭제하는것으로가정합니다. pocascadeupdates 옵션은마스터테이블의기본키에대한변경사항에대하여같은기능을제공합니다. 프로바이더에데이터를제공하는 SQLQuery가 SQL 문장에 ORDER BY 절을가지는경우, 레코드들이 ClientDataSet에서의순서를유지하도록하려면 poretainserverorder 플래그를 true로설정합니다. 만일 ClientDataSet의 CommandText 속성을변경하여 SQLQuery의 SQL 문장을변경할수있도록하려면 poallowcommandtext 옵션을 true로설정합니다. DataSetProvider의 BeforeUpdateRecord 이벤트핸들러를생성한경우, 이벤트핸들러가데이터베이스가갱신되기전에레코드에있는필드의값을변경할수있다면 popropogatechanges 옵션을 true로설정합니다. 그러면프로바이더는모든변경사항을 ClientDataSet로돌려보내메모리에들어있는레코드를갱신합니다. DataSetProvider에는유용한이벤트가많지만, 가장중요한두가지는 OnGetTableName와 BeforeUpdateRecord입니다. 여러테이블의조인, 스토어드프로시저또는읽기전용뷰에서리턴된행은데이터베이스애플리케이션에서직접편집할수없습니다. DataSetProvider에는이러한상황을처리할수있는세가지도구가있습니다. 스토어드프로시저가리턴한레코드들처럼레코드들이단일테이블의필드를포함하고

있는경우, 유일한문제는 DataSetProvider가갱신해야할테이블의이름을알아낼방법이없다는것입니다. 이에대한해법은테이블의이름을리턴하는 DataSetProvider의 OnGetTableName 이벤트핸들러를생성하는것입니다. 두번째가능성은여러테이블의조인에서단일테이블의필드가갱신되어야하는경우입니다. 먼저, 갱신될필드들을식별하도록개별필드의 ProviderFlags 속성을설정합니다. 다음으로테이블이름을리턴할 OnGetTableName 이벤트핸들러를생성하면프로바이더가자동으로 SQL 문장을생성합니다. 각레코드에대하여여러테이블을갱신해야한다면 BeforeUpdateRecord 이벤트핸들러를 DataSetProvider에추가합니다. 이벤트핸들러에서는각테이블에대한 SQL 문장을발생시켜실행할수있습니다. BeforeUpdateRecord 이벤트핸들러도갱신하기전에각레코드를검사하고필드의값을변경할장소를제공합니다. 예외를발생시켜서갱신을전체적으로봉쇄할수도있습니다. 이런이유로 BeforeUpdateRecord는비즈니스룰을적용할수있는좋은장소입니다. ClientDataSet ClientDataSet는 ProviderName 속성을통하여 DataSetProvider에연결됩니다. 이것은 DataSetProvider로부터데이터를받아서메모리에데이터를저장하고, 변경사항을기록하고, ClientDataSet ApplyUpdates 메소드가호출되면변경사항을 DataSetProvider에보냅니다. HistoryQry 컴포넌트가반환하는레코드는 EmployeQry 결과셋안에네스트된데이터셋으로표시됩니다. 이것은 SQLClientDataSets의 DataSource 속성의 HistoryQry이 EmployeeQry에연결된 EmpLinkSrc로설정되어있으며 EmployeeQry 레코드로부터 SQL 문장에대한매개변수값을취하기때문입니다. 4. EmployeeCds을마우스오른쪽으로클릭한후에팝업메뉴에서 Fetch Params를선택하면 ClientDataSet가매개변수목록을갱신하여 EmployeeQry 컴포넌트와일치되도록합니다. 5. 두번째 ClientDataSet를 HistoryCds로설정하고, DataSetField 속성을 EmployeeCdsHistoryQry로설정하면 EmployeeCds에있는네스트된데이터셋필드로부터데이터를읽어들입니다. 6. HistoryCds를더블클릭하여모든필드를추가합니다. 7. 두개의 DataSource 컴포넌트를데이터모듈에떨어뜨린후에이름을 EmployeeSrc와 HistorySrc로정합니다. 8. 이들의 DataSet 속성을각각 EmployeeCds와 HistoryCds로설정합니다. 이제 EmployeeCds와 HistoryCds 컴포넌트의 Active 속성을 true로설정할수있을것입니다. 데이터모듈은다음그림과비슷할것입니다. 다음과같이샘플애플리케이션을계속합니다. 1. 두개의 ClientDataSet를샘플애플리케이션에있는데이터모듈에끌어다놓습니다. 2. 첫번째것의 ProviderName 속성을 EmployeeProv로설정하고, Name 속성을 EmployeeCds로설정합니다. 3. EmployeeCds를더블클릭하여 Fields Editor를연후에모든필드객체를추가합니다. Fields Editor에있는마지막필드객체의이름은 HistoryQry입니다. 이것은네스트된데이터셋필드로, 각종업원레코드에대한급여이력레코드가들어있습니다. 데이터모듈은이그림과비슷할것입니다

네스트된디테일데이터셋은마스터와디테일데이터셋에대한갱신적용순서가혼동되지않도록하므로대단히강력합니다. 예를들어, 하나또는그이상의디테일레코드가있는새로운마스터레코드가추가되는경우, 마스터레코드 INSERT는디테일레코드에대한 INSERT 문장보다앞서서처리되어야합니다. 그러나, 마스터에대한디테일레코드를삭제한후에마스터레코드를삭제하면, 디테일레코드에대한 DELETE 문장이마스터에대한삭제에앞서서처리되어야합니다. 네스트된데이터셋을사용하면 DataSetProvider는데이터베이스서버에서의오류를방지하기위하여올바른순서로갱신이처리되도록보장합니다. ClientDataSet에는몇가지유용한속성이있습니다. Aggregates 속성은데이터셋에있는숫자필드의합, 최소, 최대, 개수또는평균을자동으로계산하는집계필드를제공합니다. 집계는색인으로그룹화할수있습니다. AggregatesActive 속성을통해런타임에집계계산을활성화하거나비활성화할수있습니다. 세미콜론으로구분된필드이름목록을 IndexFieldNames 속성에할당하면해당필드별로오름차순으로 ClientDataSet에있는레코드를정렬합니다. 내림차순으로정렬하거나매우큰데이터셋에서더빠른성능을얻으려면정렬하고자하는필드에색인을만들어서색인이름을 ClientDataSet의 IndexName 속성에할당합니다. CommandText 속성을사용하면 DataSetProvider에데이터를제공하는컴포넌트내의 SQL 문장을변경할수있습니다. ClientDataSet을닫고새로운 SQL 문장을 CommandText에할당한후에, ClientDataSet를열어서새로운쿼리가반환한레코드를보십시오. ClientDataSet의 Params 속성을사용하여소스데이터셋의 SQL 문장에있는매개변수에새값을할당할수도있습니다. 소스데이터셋의속성을직접액세스하는대신 ClientDataSet의 CommandText와 Params 속성을사용해야하는이유는무엇일까요? 이것은장래에프로그램을멀티티어볼랜드 DataSnap 애플리케이션으로전환하는경우코드를변경하지않아도되는장점이있기때문입니다. PacketRecords 속성은프로바이더가서버에서한번에가져오는레코드의수를제어합니다. 기본값인 1은소스데이터셋의 SQL 문장이반환한레코드를프로바이더가모두가져오는것입니다. 일반적으로이것을문제가되지않지만, 레코드수가매우많은경우에는레코드를나누어서가져올필요가있습니다. BDE와 dbexpress의 provide/resolve구조의가장큰차이점가운데하나는, 변경로그에있는변경사항을데이터베이스에적용하려면 ClientDataSet의 ApplyUpdates 메소드를호출해야한다는것입니다. 변경로그에적용되지않은변경사항이있는지여부를알려면 ChangeCount 속성을사용합니다. ApplyUpdates는한개의파라미터를가집니다. 이매개변수는오류의갯수인데, 허용치를초과하였을경우프로세스를롤백하고종료됩니다. 일반적으로 0으로설정함으로써오류가발생하자마자갱신프로세스가멈추도록합니다. 1로설정하면발생된오류의수에관계없이변경로그에있는변경사항을 DataSetProvider가모두적용합니다. 갱신오류가발생하면 ClientDataSet의 OnReconcileError 이벤트가발생합니다. 데모애플리케이션에서갱신오류를처리하려면다음절차를따릅니다. 1. Object Repository의 Dialogs 페이지로부터 Reconcile Error Dialog를프로젝트에추가합니다. 2. 데이터모듈의 uses 절에 Reconcile Error Dialog 유닛을추가합니다. 3. Reconcile Error Dialog가자동으로생성되지않도록확인합니다. 4. EmployeeCds에대한 OnReconcile 오류이벤트핸들러를생성한후에다음코드를추가합니다. Action := HandleReconcileError( DataSet, UpdateKind, E); 업데이트를적용할때에오류가발생하면 Reconcile Error Dialog가오류메시지와오류를발생시킨레코드및유저가처리방법을선택할수있는버튼들을보여줍니다. 샘플애플리케이션을마치려면다음절차를따릅니다.

1. Panel, DBGrids, DBNavigators 를각각두개씩메인 폼에추가하여아래의그림과같이구성합니다. 8. 다음과같은코드를 Button 의 OnClick 의이벤트 핸들러에추가합니다. 2. 데이터모듈유닛을폼유닛의 uses 절에추가합니다. 3. 위의 DBGrid와 DBNavigator의 DataSource 속성을 EmployeeSrc DataSource 컴포넌트로설정합니다. 4. 아래의 DBGrid와 DBNavigator의 DataSource 속성을 HistorySrc DataSource 컴포넌트로설정합니다. 5. Label 컴포넌트와 ComboBox 컴포넌트를위의 Panel에추가합니다. 6. ComboBox에 OnChange 이벤트핸들러를생성하고아래의코드를추가합니다. procedure TMainForm.DeptComboChange(Sender: TObject); with MainDm.EmployeeCds do if Active then CheckBrowseMode; Close; Params.ParamByName('DEPT_NO').AsString := Copy(DeptCombo.Text, 1, 3); Open; end; //with end; 7. Button 컴포넌트를위의 Panel에추가한후에캡션을 Save Changes로설정합니다. procedure TMainForm.SaveBtnClick(Sender: TObject); with MainDm do if EmployeeCds.ChangeCount > 0 then if HistoryCds.Active then HistoryCds.CheckBrowseMode; if EmployeeCds.Active then EmployeeCds.CheckBrowseMode; EmployeeCds.ApplyUpdates(0); EmployeeCds.Refresh; end; //if end; //with end; 9. department ComboBox를채울메소드를추가합니다. procedure TMainForm.LoadDeptCombo; with MainDm do DeptQry.Open; while not DeptQry.Eof do DeptCombo.Items.Add( DeptQryDept_No.AsString + ' ' + DeptQryDepartment.AsString); DeptQry.Next; end; //while DeptQry.Close; end; //with end; 10. 폼의 OnCreate 이벤트핸들러를생성하여다음과같은코드를추가합니다. procedure TMainForm.FormCreate(Sender: TObject); MainDm.EmployeeCds.Open; LoadDeptCombo; end;

BDE 와 dbexpress 의비교 아래의표는 BDE 와 dbexpress 를몇가지핵심적인 영역에서비교한것입니다. 이를통해전체적인차이점을 알수있습니다. 두번째표는각 BDE 컴포넌트에 해당하는 dbexpress 컴포넌트를보여줍니다. 기능 BDE DbExpress 레코드버퍼링 네트워크트래픽제어 트랜잭션제어 배포 크로스플랫폼 써드파티드라이버 아래는각 BDE 가로컬메모리에서보관할레코드의수를결정합니다. BDE 가서버로부터가져올레코드의수를결정합니다. 수동및자동트랜잭션제어가가능합니다. 트랜잭션은사용자가데이터를편집하는동안활성화됩니다. 배포크기가큽니다. ( 약 18MB) 설치와구성이복잡하며, 레지스트리변경이필요합니다. 윈도우 개발이어렵습니다. 실제로존재하는것이거의없습니다. 개발자가로컬에보관할레코드의수를결정합니다. 사용자가서버에서가져올레코드의수와시기를결정합니다. 수동및자동트랜잭션제어가가능합니다. 트랜잭션은갱신이적용되는짧은순간에만활성화됩니다. 총 0.5 MB 미만의 DLL 2 개만필요하며, 사용자의 EXE 에컴파일되어포함될수있습니다. dbxconnections.ini 와 dbxdrivers.ini 파일을배포하지않는한레지스트리를변경할필요가없습니다. 윈도우, 리눅스 개발이쉬우며많이존재합니다. 써드파티드라이버에관한정보는 Borland Developer Network 웹사이트 bdn.borland.com 를참조하십시오. BDE 컴포넌트에해당하는 dbexpress 컴포넌트들을보여주는표입니다. dbexpress 에는 BDE BatchMove 컴포넌트에해당하는것이없습니다. 세션의개념은 dbexpress 에존재하지않기때문에 BDE 세션컴포넌트에대응하는것이필요없습니다. BDE UpdateSQL 컴포넌트는 BDE 의 Query 컴포넌트의캐시 업데이트기능과함께만사용됩니다. dbexpress 의경우에는 ClientDataSet 컴포넌트의기능이이기능을대신합니다. 네스트된데이터셋을처리하는기능은 dbexpress 의 DataSetProvider 와 ClientDataSet 컴포넌트에내장되어 있습니다. BDE SQL Links 애플리케이션을 dbexpress 로마이그레이션하기 BDE 와 SQL Links 드라이버를사용하는애플리케이션을 dbexpress 로전환하려면다음의절차가필요합니다. 대부분의클라이언트 / 서버애플리케이션은 BDE 의 Table 컴포넌트를사용하지않습니다. 로컬데이터베이스 애플리케이션은 BDE 의 Table 컴포넌트를대단히많이 사용하므로, 뒤에나오는 로컬데이터베이스 애플리케이션을 dbexpress 로마이그레이션하기 에서 다룹니다. BDE Database 컴포넌트를 SQLConnection 컴포넌트로바꿉니다. BDE Query와 StoredProc 컴포넌트를 SQLQuery 및 SQLStoredProc 컴포넌트로바꿉니다. BDE TDatabase TQuery TStoredProc TTable No equivalent TBatchMove SQL Monitor Utility Session UpdateSQL NestedDataSet BDEClientDataSet DbExpress TSQLConnection TSQLQuery TSQLStoredProc TSQLTable TSQLDataSet No equivalent TSQLMonitor N/A N/A N/A SimpleDataSet 양방향스크롤링과편집이필요한각 SQLQuery와 SQLStoredProc에대하여 DataSetProvider와 ClientDataSet를추가합니다. BDE Database를 SQLConnection으로바꾸기 각 BDE 데이터베이스컴포넌트를 SQLConnection 컴포넌트로바꾸어야합니다.

연결매개변수설정하기애플리케이션을변경하지않고데이터베이스연결을변경하기위하여 BDE 알리아스를사용하는경우에는 dbexpress 연결이름을사용하거나연결파라미터를 INI 파일에저장해야합니다. 가장유연성있고강력한방법은연결파라미터를가진애플리케이션자신만의 INI 파일을이용하는것입니다. 이방법을선택하면 INI 파일을읽기위한코드를애플리케이션에추가하고시작할때에 SQLConnection 컴포넌트의 Params 속성을설정해야합니다. INI 파일에있는연결파라미터를편집하기위한코드를애플리케이션에추가할수도있습니다. 트랜잭션의처리애플리케이션을변환하기전에해야할중요한결정가운데하나는트랜잭션제어를어떻게제어할것인가입니다. BDE 애플리케이션에서트랜잭션제어를 BDE가자동으로처리하도록한경우에는변경사항을데이터에저장하고자하는곳마다 ApplyUpdates의호출을추가하기만하면됩니다. 이렇게하면 dbexpress는 BDE처럼트랜잭션을처리해줄것입니다. 갱신후에도같은레코드셋으로작업을계속할경우에는 ClientDataSet Refresh 메소드를호출해야합니다. 호출하면소스쿼리를재실행하고, 새로운결과셋을 ClientDataSet에읽어들입니다. 그러면그사이에다른사람이실행한변경사항을볼수있습니다. BDE 애플리케이션이 StartTransaction, Commit 및 Rollback을명시적으로호출하는경우에는선택이더복잡해집니다. 한가지선택방법은코드와관련된트랜잭션을모두제거하고 Commit에대한각호출을해당 ClientDataSet의 ApplyUpdates 메소드에대한호출로대체하는것입니다. 그러면 dbexpress가트랜잭션을대신처리해주고코드를간단하게합니다. 이방법을실행할수없는단한가지경우는두개이상의 ClientDataSet의갱신을하나의트랜잭션에결합해야하는경우입니다. 명시적인 Rollback 호출은 ClientDataSet CancelUpdates 메소드에대한호출로대체해야합니다. CancelUpdates은 ClientDataset의변경로그에남아있는변경사항을취소시킵니다. 다른선택방법은명시적트랜잭션제어문장을유지하는것입니다. 의외로, 이것은다음의세가지이유로인해서가장어려운방법입니다. 각 Commit 전에 ApplyUpdates에대한호출을추가해야합니다. dbexpress의 provide/resolve 구조가제공하는짧은트랜잭션시간의장점을이용하려면모든 StartTransaction에대한호출의위치를변경해야합니다. TTransactionDesc 파라미터를전달하기위해서모든 StartTransaction, Commit 및 Rollback에대한호출을변경해야합니다. 보시다시피명시적트랜잭션을유지하는것보다제거하는것이더간단합니다. 이세단계를자세히검토하겠습니다. 트랜잭션을시작하고 Commit에대한각호출을하기전에트랜잭션에참여하는각 ClientDataSet의 ApplyUpdates 메소드를호출해서 ClientDataSet 변경로그에있는변경사항들이데이터베이스에적용되도록해야합니다. ApplyUpdates를호출하기전에는데이터베이스가변경되지않으므로변경사항을적용할것이없습니다. BDE 클라이언트 / 서버애플리케이션의경우트랜잭션제어프로세스는다음과같습니다. 1. 트랜잭션을시작합니다. 2. 사용자가데이터를편집하도록합니다. 3. 트랜잭션을적용하거나취소합니다. 이모델에서트랜잭션은사용자가데이터를편집하는동안계속활성화상태에있습니다. dbexpress provide/resolve 구조의주요장점가운데하나가짧은트랜잭션시간입니다. 이장점을이용하려면트랜잭션제어프로세스가다음절차를따라야합니다. 그래야사용자가변경사항을만드는동안트랜잭션이활성화되지않습니다. 1. 사용자가 ClientDataset의데이터를편집하도록 합니다. 2. 트랜잭션을시작합니다. 3. ApplyUpdates를호출합니다. 4. 트랜잭션을적용하거나취소합니다.

프로그램에서트랜잭션제어프로세스를 dbexpress 모델로변경하려면 StartTransaction에대한각호출을각각에해당하는 Commit에대한호출의바로앞으로이동해야합니다. 그런후, ApplyUpdates에대한호출을 StartTransaction에대한호출과 Commit에대한호출사이에추가합니다. BDE Database 컴포넌트와 dbexpress SQLConnection 컴포넌트는모두 StartTransaction, Commit 및 Rollback 메소드가있습니다. BDE와는달리, dbexpress는데이터베이스가지원하는한도내에서동시에여러트랜잭션이활성화되는것을허용합니다. 다수의트랜잭션을지원하려면 SQLConnection StartTransaction, Commit 및 Rollback 메소드가 TTransactionDesc 타입의파라미터을가져야합니다. TTransactionDesc는다음과같이선언됩니다. TTransactionDesc = packed record TransactionID : LongWord; GlobalID : LongWord; IsolationLevel : TTransIsolationLevel; CustomIsolation : LongWord; end; StartTransaction, Commit 및 Rollback에대한모든호출을변경하여 TTransactionDesc 변수를파라미터로전달하도록합니다. 모든 DataSet 컴포넌트바꾸기 데이터셋컴포넌트를모두바꾸는것은변환과정에서가장큰작업입니다. 각 BDE Query 컴포넌트를 SQLQuery 컴포넌트로바꾸어야하고, 각 BDE StoredProc 컴포넌트를 SQLStoredProc 컴포넌트로바꾸어야합니다. BDE 컴포넌트에는 dbexpress 컴포넌트에는없는속성이나이벤트가있기때문에이과정은복잡합니다. 코드에존재하지않는속성에대한참조가있으면모두제거해야합니다. 양방향액세스또는레코드편집기능이필요한각 SQLQuery 및 SQLStoredProc 컴포넌트에대하여 DataSetProvider와 ClientDataSet를추가해야합니다. SQLQuery와 SQLStoredProc에없는이벤트에대한이벤트핸들러를 ClientDataSet의해당이벤트에연결합니다. 기존코드에대한변경을최소화하려면 ClientDataSet 컴포넌트의이름을바꾸려는 Bolrand Database Engine Query 또는 BDE StoredProc 컴포넌트와같이정하는것을고려할수있습니다. 각각의동시트랜잭션에대하여 TTransactionDesc 형식의변수를선언하고 TransactionId를현재활성화되어있는트랜잭션가운데고유한번호로설정해야합니다. GlobalId 필드는오직 Oracle 데이터베이스트랜잭션과함께만사용됩니다. IsolationLevel은 xildirtyread이나 xilreadcommitted, 또는 xilrepeatableread로설정되어야합니다. CustomIsolation 필드는현재사용되지않습니다. BDE은동시에활성화된여러트랜잭션을지원하지않습니다. 그러므로트랜잭션제어문장을포함하는각유닛의 uses 절에있는유닛의인터페이스섹션에서 TTransactionDesc 형식의하나의변수만선언하면됩니다. 애플리케이션의시작코드에서 TransactionId 필드를 one으로설정하고, IsolationLevel를 xilreadcommitted 또는 xilrepeatableread으로설정합니다. 마지막으로, SQLQuery 및 SQLStoredProc 컴포넌트로되돌아가서 Fields Editor를사용하여필드객체를생성합니다. 필드객체를생성한후에는기본키에있는각필드에대하여 pfinkey 프로바이더플래그를 true로설정합니다. 갱신하지않아야할계산필드가있는경우에는 pfinupdate 및 pfinwhere 프로바이더플래그를 false로설정합니다. DataSetProvider와 ClientDataSet를추가할필요가없는경우도있을수있습니다. 예를들어, 콤보박스나목록박스의 Items 속성의필드값가운데하나를추가하기위해서결과세트를첫행부터마지막까지한번읽은쿼리가있다고가정합시다. 이런경우, 레코드를한방향으로만스캔하고읽기전용액세스만을필요로하기때문에 SQLQuery 또는 SQLStoredProc 컴포넌트를직접사용할수있습니다.

BDE 애플리케이션에서캐시업데이트를사용하는경우에는 BDE Query 컴포넌트를 SQLQuery 컴포넌트로변환할때 UpdateSQL 컴포넌트를제거합니다. ClientDataSet와 DataSetProvider는같은기능과장점을가지고있으므로 dbexpress에서는캐시업데이트가필요없습니다. 마지막으로, 앞에서설명한바와같이 ClientDataSet의 ApplyUpdates 메소드에대한호출을추가하여트랜잭션제어에대해 ClientDataSet 로컬버퍼의데이터에대한변경사항이데이터베이스에기록되도록할것을잊지말아야합니다. 데이터타입매핑 dbexpress는 BDE에서작업할때에접하지못했던두가지새로운데이터타입을사용합니다. 배정도부동소수점값에적합하지않은모든숫자값은 TFMTBCDField 객체에들어가서애플리케이션으로반환됩니다. TFMTBCDField 객체는값을 32자리최대정밀도의 true BCD 값인 TBCD 타입으로저장합니다. TFMTBCDField의값으로수식을계산하려면 AsVariant 속성을사용하여값을 variant 변수로저장합니다. DbExpress는날짜-시간값을반환하기위해 TSQLTimeStampField 필드객체타입를사용합니다. TSQLTimeStampField는날짜-시간정보를 TSQLTimeStamp 타입의변수에저장합니다. TSQLTimeStamp는연, 월, 일, 시, 분, 초및그이하에대해각각의필드를가진 Delphi 레코드 (C++ 의구조체 ) 입니다. 그이하란 1천분의 1초의단위를말합니다. TSQLTimeStamp는정밀도의손실없이날짜-시간값이저장되도록합니다. TSQLTimeStampField에는날짜-시간값을다른데이터타입으로바꾸기위한 As 속성이있습니다. BatchMove 컴포넌트바꾸기 dbexpress에는 BDE의 BatchMove 컴포넌트에해당하는것이없습니다. 애플리케이션에서 BatchMove 컴포넌트를사용하는경우에는이를코드로바꾸어야합니다. 로컬데이터베이스애플리케이션을 dbexpress 로마이그레이션하기 Paradox 나 dbase 와같은로컬데이터베이스를사용하는 애플리케이션을 dbexpress 로마이그레이션하는경우에는몇 가지추가로처리해야할문제가있습니다. 데이터변환 dbexpress 는 Paradox 나 dbase 테이블을지원하지않으므로 dbexpress 가지원하는 SQL 데이터베이스서버로변경하고 데이터를새로운데이터베이스로옮겨야합니다. 이것을 위해서는다음과같은세가지방법이있습니다. Delphi와 C++Builder에포함되어있는 BDE Data Pump 유틸리티를사용합니다. 써드파티변환유틸리티를사용합니다. 일부 데이터베이스에는데이터임포트또는변환 유틸리티가포함되어있습니다. 또한, 인터넷에서 무료또는저렴한가격에사용할수있는변환 유틸리티를찾을수도있습니다. 데이터변환프로그램을직접작성합니다. 변환한 SQL 데이터베이스가로컬데이터베이스에있는 모든데이터종류를지원하지않을수있습니다. 예를들어, Paradox 에는 Boolean 데이터타입이있지만, 모든 SQL 데이터베이스서버가그런것은아닙니다. 변환유틸리티를 이용하려는경우에는새로운데이터베이스가직접 지원하지않는데이터타입을확인하고변환툴이이러한 타입을어떻게처리하는지결정해야합니다. 대부분의 SQL 데이터베이스서버는 CHAR 와 VARCHAR 데이터타입을모두지원하지만, 로컬데이터베이스는단일 문자열타입을가지고있습니다. 여러분의변환툴이 문자열필드를여러분의데이터베이스서버에있는올바른 데이터타입으로변환하는지확인해야합니다. 데이터타입을변환하려는이유는여러가지가있을수 있습니다. 예를들어, Paradox 테이블은모든실수를배정도 부동소수점형식으로변환하는반면, 대부분의 SQL

데이터베이스서버는 NUMERIC이나 DECIMAL과같은고정소수점형식을지원합니다. 부동소수점과는달리, 고정소수점형식은모든소수점이하의수를정확하게표현할수있고, 따라서화폐단위나기타소수점이하의수가중요한데이터를저장하는경우훨씬좋은선택입니다. 여기에서도사용하려는변환툴이이러한종류의변환을처리할수있는지확인해야합니다. 서버보안정확한사용자이름과비밀번호를입력하지않으면 SQL 데이터베이스서버에서데이터베이스를열수없습니다. 애플리케이션의모든사용자가데이터베이스서버에서같은사용자이름과비밀번호를사용하거나, 각사용자가각각의계정을가지도록할수도있습니다. 보안을어떻게처리하든애플리케이션에코드를추가해야합니다. 대부분의로컬데이터베이스에서는승인되지않은접근을방지하기위해서데이터베이스를암호화할수있으나, 데이터베이스서버에서는그렇지않은경우가많습니다. 암호화하지않는대신, 승인되지않은접근으로부터데이터베이스파일을보호하기위해서운영시스템의보안기능에의존합니다. 일반적으로물리적인데이터베이스파일에대한접근이필요한사용자는데이터베이스관리자와데이터베이스서버서비스를사용하는계정뿐입니다. 만일애플리케이션이판매원이들고다니는노트북컴퓨터와같은독립시스템에설치된경우에는필요로하는보안방식을데이터베이스가지원하는지여부를확인해야합니다. 셋구조전형적인로컬데이터베이스애플리케이션은 BDE Table 컴포넌트를사용하여전체테이블을열고살펴볼수있도록합니다. 이방식은 SQL 데이터베이스서버에서는전체테이블을데이터베이스서버로부터네트워크를거쳐각워크스테이션으로가져와야하므로성능이저하될수있습니다. 테이블컴포넌트도메타데이터를가져오면서많은네트워크와서버대역을사용하므로서버에서레코드를셀렉트하고갱신하도록 SQL 문장을구성할수있습니다. 클라이어트 / 서버애플리케이션이올바로디자인되어있다면 ClientDataSet에서메모리에레코드를보유하는것은애플리케이션이서버로부터한번에레코드를조금씩가져오기때문에문제되지않습니다. 그러나, 사용자가큰테이블을볼수있는로컬데이터베이스애플리케이션을변환하는것은전체테이블이 ClientDataSet에의해서메모리에저장되기때문에클라이언트에상당한메모리를소모하게합니다. BDE Table 컴포넌트를사용하는애플리케이션을변환하는경우, 다음과같은세가지방법이있습니다. 1. 각 BDE 컴포넌트를 SQLTable, DataSetProvider 및 ClientDataSet로바꿉니다. 2. 각 BDE 컴포넌트를 SQLQuery, DataSetProvider 및 ClientDataSet로바꾸고, 테이블에서모든열과행을셀렉트합니다. 3. 각 BDE 컴포넌트를 SQLQuery, DataSetProvider 및 ClientDataSet로바꾸고, 애플리케이션을클라이언트 / 서버셋지향으로변환합니다. 첫째방법은 SQLTable 컴포넌트의속성들이 BDE Table 컴포넌트의속성들과가장비슷하므로가장쉽습니다. 이경우테이블이너무크지않다면성능은좋습니다. 이방법의단점은나중에데이터셋의일부또는전부를변환하여더작은셋의레코드를선택하도록하는경우 SQLTable 컴포넌트를 SQLQuery 컴포넌트로바꾸어야하는것입니다. 둘째방법은더나은선택입니다. 행과열을모두선택해야하기는하지만애플리케이션은쿼리에기반을둘수있습니다. 나중에더욱셋지향적인디자인으로바꾸려면데이터액세스컴포넌트에서 SQL 문장을바꾸면됩니다. 셋째방법은코드를많이변경해야합니다. 클라이언트 / 서버환경을위해서디자인된애플리케이션은일반적으로데이터를표시하기전에사용자가선택범위를입력해야합니다. 선택범위는사용자가작업할약간의레코드를가져오도록쿼리의 WHERE 절에서사용됩니다. 일단사용자가한셋의레코드에서작업을끝낸후에는

다른셋의선택범위를입력하여다음세트의레코드를가져옵니다. 애플리케이션에서전체테이블을살펴볼수있도록되어있다면사용자가선택범위를입력할수있도록코드와폼을추가해야하고사용자가제공한값을이용하기위해 WHERE 절을변경해야합니다. dbexpress는 BDE 데이터셋컴포넌트의속성, 메소드및이벤트와유사하게디자인된데이터셋컴포넌트들을포함하고있으므로변환하는데드는노력을최소화해줍니다. 따라서, 기존의코드의변경을최소화하면서도더뛰어난기술로옮겨갈수있습니다. 요약 애플리케이션을 BDE 에서 dbexpress 로마이그레이션하면 다음과같은많은이점이있습니다. 더짧은트랜잭션 네트워트트래픽과시스템리소스사용에대한 제어권확대 용량및시스템리소스사용감소 성능향상 더용이한배포 더작아진배포패키지 크로스플랫폼지원 저자소개 Bill Todd는 Phoenix 인근에있는데이터베이스컨설팅및개발회사인 The Database Group, Inc. 의사장입니다. 그는 4권의데이터베이스프로그래밍서적과 90개이상의기사공동저자이며, Team Borland의회원으로서볼랜드인터넷뉴스그룹에기술지원을제공하고있습니다. 그는미국및유럽의 Borland Developer Conferences에서 24개이상의글을발표하였습니다. 빌은전국적으로잘알려진강사로서, 미국과해외에걸쳐 Delphi와 InterBase 프로그래밍을강의하였습니다. 빌의연락처는 bill@dbginc.com입니다. Made in Borland Copyright c 2002 Borland Software Corporation. All rights reserved. All Borland brand and product names are trademarks or registered trademarks of Borland Software Corporation in the United States and other countries. All other marks are the property of their respective owners. Corporate Headquarters: 100 Enterprise Way, Scotts Valley, CA 95066-3249 831-431-1000 www.borland.com Offices in: Australia, Brazil, Canada, China, Czech Republic, France, Germany, Hong Kong, Hungary, India, Ireland, Italy, Japan, Korea, the Netherlands, New Zealand, Russia, Singapore, Spain, Sweden, Taiwan, the United Kingdom, and the United States. 13409