C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

컴포넌트/라이브러리
Delphi/C++Builder Programming Components&Libraries
[553] ASQLite 3.5.9 Lib for C++Builder 6.
김태선 [cppbuilder] 13083 읽음    2009-01-09 16:10
이 라이브러리는 C++Builder 에서
SQLite3 DB를 사용하기 위한 콤포넌트인 ASQLite(Aducom Sqlite)를 라이브러리화 시킨 것이다.

본래의 ASQLite는 델파이에 컴포넌트를 설치하여 사용하는 것이 가능하나,
이 버전은 C++Builder6에는 설치가 되지 않았다.

이는 ASQLite가 SQLite의 기능을 당연히 사용하는데,
SQLite 는 C 언어로 만들어져 있고, 당연히 C Runtime 라이브러리를 사용하게 되는데,
이 라이브러리가 델파이에 없으므로,
콤포넌트를 만드는 과정에서 C Runtime 라이브러리를 obj 화 시킨 것과 링크하는데 이 부분에서 문제가 발생한다.

C++Builder 6에서는 아예 컴파일 조차도 완료 되지 않는다.

그래서 이 부분을 본래의 C Runtime을 사용하도록 프로그램을 수정해서
라이브러리로 세팅한 것이, 필자가 릴리즈하는 ASQLite 라이브러리인 것이다.

이로 인해 빌더 6는 물론이고 아랫버전인 빌더 5,
컴포넌트가 설치되지 않는 빌더 2006 Explorer 에서 사용할 수 있을 것으로 기대한다.
(빌더 2007 2009 에서는 되지 않는다. ASQLite 가 빌더6에서 컴파일 되었기 때문이다. 2006 도 안될지 모른다.
어쨋던 실험은 빌더 6에서만 했으니. 빌더6 외 버전은 필자가 필요할 때 다시 손봐 올리겠다.)


사용방법은 자신의 프로젝트가 있는 폴더에
lib 폴더에 있는 3가지 파일인

ASGRout3.hpp
ASGSQLite.hpp
ASQLite3_5_9.lib

파일을 복사하고, 프로젝트에

ASQLite3_5_9.lib

를 포함하면 준비 끝.

코드는 대략 아래와 같이 구사하면 된다.

컴포넌트를 사용할 폼이 있는 곳에서
단지
#include "ASGSQLite3.hpp"
만 해주면 자유롭게 사용 가능하다.

이 코드는 테스트 어플에 포함되어 있으므로 그것을 열어봐도 된다.

라이브러리 형태이기 때문에 아래 코드처럼 동적 생성해서 사용하면 된다.
원래 ASQLite 를 델파이에 설치해봐도 Non-Visual Component라서
컴포넌트 사용방법을 알면, 컴포넌트로 설치해서 사용하나 동적 생성으로 사용하나
별 차이가 없을 것이다.


//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "ASGSQLite3.hpp"

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    ASQLite3DB1 = new TASQLite3DB(this);
    ASQLite3Query1 = new TASQLite3Query(this);
    ASQLite3Table1 = new TASQLite3Table(this);
    ASQLite3Pragma1 = new TASQLite3Pragma(this);
    ASQLite3UpdateSQL1 = new TASQLite3UpdateSQL(this);
    ASQLite3Log1 = new TASQLite3Log(this);
    ASQLite3InlineSQL1 = new TASQLite3InlineSQL(this);
    ASQLite3Output1 = new TASQLite3Output(this);

    ASQLite3DB1->Database = "test.db3";
    ASQLite3DB1->StaticallyLinked = true;


    DataSource1->DataSet = ASQLite3Query1;
    ASQLite3Query1->Connection = ASQLite3DB1;
    ASQLite3Query1->SQL->Add("select name,age from aaa order by name");
    ASQLite3Query1->Active = true;
}

//---------------------------------------------------------------------------

이렇게 하면 단일한 실행화일 하나로 만들어 진다.

매우 성능 좋은 RDB를 실행화일 내부에 포함하고도,
배포시 다른 어떤 것도 필요로 하지 않는다.
보통 SQLite 를 쓰면 SQLite3.dll을 요구하게 되는데,
이것도 내부에 정적 링크가 되어 있으므로 따로 필요 없다.

SQLite는 네이트온이나 스카이프 등에서도 사용되어 진다고 알려져 있는데,
이런 막강한 RDB를 내 프로그램에 포함해서 자유롭게 사용할 수 있다는 것은
매우 기분 좋은 일이다.

특히 VC에서는 SQLite 함수들을 직접 핸들링해서 사용하는 것에 비해
ASQLite 를 통해 DataSet을 확보함으로써
Data Control 콤포넌트를 통해 쉽게 프로그래밍 할수 있다는 것은 너무나 반가운 일이다.
그 편의성이라는 것은 스포츠카와 스쿠터 수준의 차이다.


이 테스트는 모두 C++Builder 6 버전에서 행해졌으며, 다른 버전에서는 테스트되지 않았다.
C++이지만 obj 포멧이 틀리므로 VC에서는 사용할 수 없다.


마지막으로 하나, 한글 코드 문제를 말하자면,
본디 SQLite 는 ansi, UTF-8, UTF-16 모두 코드를 지원한다.
하지만 ASQLite 에서는 ansi는 지원하지 않는다.
따라서 UTF-8로 엔코딩해서 처리하는 편할 것이다.
VCL에는 이를 위한

extern PACKAGE int __fastcall UnicodeToUtf8(char * Dest, wchar_t * Source, int MaxBytes)
extern PACKAGE unsigned __fastcall UnicodeToUtf8(char * Dest, unsigned MaxDestBytes, wchar_t * Source, unsigned SourceChars)
extern PACKAGE int __fastcall Utf8ToUnicode(wchar_t * Dest, char * Source, int MaxChars)
extern PACKAGE unsigned __fastcall Utf8ToUnicode(wchar_t * Dest, unsigned MaxDestChars, char * Source, unsigned SourceBytes)
extern PACKAGE AnsiString __fastcall UTF8Encode(const WideString WS);
extern PACKAGE WideString __fastcall UTF8Decode(const AnsiString S);
extern PACKAGE AnsiString __fastcall AnsiToUtf8(const AnsiString S);
extern PACKAGE AnsiString __fastcall Utf8ToAnsi(const AnsiString S);

이러한 함수들이 준비되어 있으므로 매우 쉽게 처리할 수 있다.

하지만 ASQLite 콤포넌트를 사용하게 되면 위 함수를 쓰지 않아도 자동으로 처리가 된다.
그냥 일반문자열 ansi 로 입출력을 행할 수 있게 된다.
다만 Text 필드는 테이블에서 내용을 가져올때 한번 Utf8ToAnsi 함수를 써서 변환해주면 된다.



C++Builder로의 마이그레이션 작업 : 김태성 (jsdkts@korea.com)
3.5.9 릴리즈
    환기 9208년, 웅기 5907년, 단기 4342년, 서기 2009년 1월 9일


모든 저작권은 여기에 포함된 본래의 파일의 저작권을 따른다.
망치 [mangchy]   2009-01-09 19:12 X
알아보니 SQLite가 2TB까지 지원하는군요...훌륭하네요...
김태선 [cppbuilder]   2009-01-09 19:40 X
사용자 중에 몇기가 짜리 DB를 몇년간 유지하는데도 이상이 없다고 하는 소문도 있더군요.
크레브 [kkol]   2009-01-11 10:35 X
잘쓰겠습니다.^^ 시간날때 한번 사용해봐야겠군요.
아무래도 파이어버드 보다 속도가 더 빠르겠지요?
김태선 [cppbuilder]   2009-01-11 14:35 X
예. 속도는 정말 빠릅니다. 파이어버드와 직접 비교는 안해 봤지만,
로칼 DB 중 최강 수준이라고 합니다.

+ -

관련 글 리스트
553 ASQLite 3.5.9 Lib for C++Builder 6. 김태선 13083 2009/01/09
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.