이 라이브러리는 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일
모든 저작권은 여기에 포함된 본래의 파일의 저작권을 따른다.
|