이 라이브러리는 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 라이브러리인 것이다.



사용방법은 자신의 프로젝트가 있는 폴더에 
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)/* overload */;
extern PACKAGE unsigned __fastcall UnicodeToUtf8(char * Dest, unsigned MaxDestBytes, wchar_t * Source, unsigned SourceChars)/* overload */;
extern PACKAGE int __fastcall Utf8ToUnicode(wchar_t * Dest, char * Source, int MaxChars)/* overload */;
extern PACKAGE unsigned __fastcall Utf8ToUnicode(wchar_t * Dest, unsigned MaxDestChars, char * Source, unsigned SourceBytes)/* overload */;
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);

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




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


모든 저작권은 여기에 포함된 본래의 파일의 저작권을 따른다.
