我早就鼓吹過:SQLite是最好的本地文件型數據庫。
在Windows下,它只要一個幾百K的DLL就可以驅動,管理工具也只是一 個幾百K的EXE程序就行了。相比之下,ACCESS龐大得令人生厭,即使是一個OLE-DB驅動也有至少10M以上的size,更不用說Foxpro, Paradox……那一大堆的表文件了。當然,SQLite的性能還不能跟那個BT的BerkeleyDB相比——BDB根本不能算是一個完整的數據庫, 連 SQL都不支持。
不過因為VCL提供的BDE、ADO、DBX等開發手段都沒有提供對SQLite的支持——PostgreSQL至少還可 以通過OLD-DB驅動用ADO方式連接。所以用Delphi或BCB訪問SQLite還是比較麻煩的。我之前都只是在Python應用中使用 SQLite。
幸好開源社區很快為此提供了支持,那就是優秀的開源數據庫控件包:ZEOSDBO。它基于VCL標準的數據庫接口實現,可以像BDE、ADO、DBX那樣使用這一組控件,它支持的數據庫和開發工具有:
支持的數據庫:Sybase/ASA、Oracle、MS SQL、MySQL、InterBase/Firebird、PostgreSQL、SQLite/3等。
支持的VCL開發工具:Delphi 5-10,BCB 5/6,Kylix 2/3,Lazarus等。
然 而因為版權的原因,我現在只使用CodeGear的免費開發工具:Turbo C Explorer(TCX)。由于免費版的License限制,不能在TCX中安裝任何第三方控件,所以我無法直接使用ZEOSDBO。不過我既然已經大 言不慚地號稱DELPHI專家多年,要是連這也搞不定,那也太沒面子了吧。挖卡卡。
經過一番試驗,這個問題最終還是得以解決。其實也沒有什么技術含量,無非是麻煩一點罷了:
啟動TCX,創建一個VCL應用,在Project里加入以下文件夾中的所有PAS文件:
ZEOSDBO/src/core
ZEOSDBO/src/dbc
ZEOSDBO/src/parsesql
ZEOSDBO/src/plain
然后在Project里加入 ZEOSDBO/src/component 文件夾中的必要文 件——用到哪幾個控件就加哪幾個控件的文件,比如常用的ZConnection.pas和ZDataset.pas,其它不必要的文件不用加入。特別是文 件名中包含"Editor"的屬性編輯功能單元,因為它們用到了控件Design的一些東西,而這些在免費版的TCX中是沒有的,加入這些單元將導致編譯 失敗。
加好文件以后暫時不要在程序中引用,而是先編譯一下,生成必要的相關文件——如.hpp等。正常情況下除了會出現幾個HINT或WARNING以外,都能成功編譯。
之后就可以在程序中引用ZEOSDBO訪問SQLite了。
Unit1.h內容大致如下(其中偷懶用了STL中的auto_ptr管理ZEOSDBO控件對象的生命周期):
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ZConnection.hpp>
#include <ZDataset.hpp>
#include <memory>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
private: // User declarations
std::auto_ptr<TZConnection> zConn;
std::auto_ptr<TZTable> tblPerson;
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
在Unit1.cpp中就可以如下代碼所示訪問SQLite了:
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner),
zConn( new TZConnection(this) ),
tblPerson( new TZTable( this) )
{
zConn->Protocol = "sqlite-3";
zConn->HostName = "localhost";
zConn->Database = ChangeFileExt( Application->ExeName, ".sqlite3" );
zConn->User = "";
zConn->Password = "";
zConn->Connect();
tblPerson->Connection = zConn.get();
tblPerson->TableName = "person";
tblPerson->Open( );
//...
}
最后再廢話一句:SQLite可是開源免費跨平臺的哦。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1609484
新聞熱點
疑難解答