標籤:
file:0 前言
本文的目的在於採用流水賬方式來記錄學習delphi訪問嵌入式資料庫sqlite中的一些點滴。歡迎各位同好共同學習和批評指正。
file:1 準備工作part1
delphi版本:delphi2007 for win32 update3。任意安裝版本即可。
sqlite dll版本:3.5.3。目前最新版本的sqlite引擎。[ http://www.sqlite.org/ ]
sqlite for delphi:simple sqlite 3.0 for delphi。目前的最新版本的發布日期為27 August 2007,支援sqlite dll版本3.4.2。經簡單測試,3.5.3也是可以的。內建demo。[ http://www.itwriting.com/sqlitesimple.php ]
file:2 準備工作part2
建立一個表單應用程式工程,並設定儲存的檔案夾。將simple sqlite 3.0 for delphi 中的 sqlite3.pas,sqlite3table.pas,sqlite3udf.pas拷貝至工程所在的檔案夾。並在工程中添加這三個檔案。拷貝sqlite.dll到編譯產生exe檔案的檔案夾。這個要看個人的設定。
file:3 初步測試
引用SQLiteTable3.pas單元。
在表單上建立一個叫btnVersion的按鈕(Tbutton)。在btnVersion的click事件中寫入下面的代碼。
procedure TfrmAbout.btnVersionClick(Sender: TObject);
var
SqliteDB:TSQLiteDatabase;
begin
SqliteDB:=TSQLiteDatabase.Create(‘‘);
showmessage(‘Sqlite dll version:‘+SqliteDb.version);
SqliteDB.Free;
end;
編譯運行,成功的話,將會顯示當前的sqlite dll的版本號碼,我的是3.5.3。
file:4 簡單工作原理描述
在simple sqlite3.0 for delphi的幾個檔案中,主要用到兩個檔案。分別是sqlite3.pas,sqlite3table.pas。
sqlite3.pas實現sqlite.dll的介面外部定義。
sqlite3table.pas進行簡單的訪問函數封裝。
在delphi中,通過sqlite3table.pas來實現對sqlite資料庫的各種訪問。
關於sqlite3udf.pas,根據作者的描述,主要用與建立使用者自訂函數,具體功能未測試。
file:5 讀取資料
假設,我們有一個叫做database.db的sqlite資料庫檔案,在編譯產生的exe檔案所在的目錄。裡面有一個叫做countries的表格。
表格建立語句如下。
CREATE TABLE "Countries" (
Name VARCHAR NOT NULL PRIMARY KEY UNIQUE,
Capital VARCHAR NOT NULL,
Area INTEGER NOT NULL,
Pop INTEGER NOT NULL,
PCI INTEGER NOT NULL
);
我們該如何訪問其中的第一條資料呢。
var
SqliteDB:TSQLiteDatabase;
SqliteTB:TSQLiteTable;
begin
SqliteDB:=TSQLiteDatabase.Create(‘database.db‘);
SqliteTB:=SqliteDB.GetTable(‘Select * from countries‘);
顯示控制項1.text:=SqliteTB.FieldAsString(SqliteTB.FieldIndex[‘Name‘]);
顯示控制項2.text:=SqliteTB.FieldAsString(SqliteTB.FieldIndex[‘Capital‘]);
顯示控制項3.text:=SqliteTB.FieldAsString(SqliteTB.FieldIndex[‘Area‘]);
顯示控制項4.text:=SqliteTB.FieldAsString(SqliteTB.FieldIndex[‘Pop‘]);
顯示控制項5.text:=SqliteTB.FieldAsString(SqliteTB.FieldIndex[‘PCI‘]);
SqliteTB.free;
SqliteDB.free;
end;
TSQLiteTable類有兩個方法,分別是Next和Previous,是用來向後和向前移動資料遊標的。配合這兩個方法,我們可以讀取表格任意資料內容。例如select * from countries where area >8000000的資料。
file:6 寫入資料
我們可以讀取資料,就可以寫入資料。如何來做到呢?還是以Countries表為例。
var
SqliteDB:TSQLiteDatabase;
begin
SqliteDB:=TSQLiteDatabase.Create(‘database.db‘);
SqliteDB.ExecSQL(‘Insert Into Countries (Name,Capital,Area,Pop,PCI) values ("China","Beijing",9600000,1500000000,6000)‘);
SqliteDB.Free;
end;
同樣,資料的update方法也可以按照這種方法來實現。在這裡可以看到,字元類資料可以用雙引號來標記起來,而不是通常sqlserver的單引號標記。
file:7 字元編碼
訪問過MySql資料庫資料的朋友應該記得噩夢般的中文資料存取經曆。資料庫裡用了一種編碼,程式又是另一種編碼,導致中文資料變成亂碼。
sqlite中,資料庫內用的是UTF-8存取,DELPHI取出的資料是ASCII編碼。也就是說,我們需要在存取的同時做編碼轉換。
有這樣兩個方法,utf8decode(),utf8encode()。當從資料庫中讀取資料時,我們用utf8decode();當向資料庫中寫入資料時,我們用utf8encode();
例如:
顯示控制項.text:=utf8decode(sltb.FieldAsString(sltb.FieldIndex[‘Name‘]));
SqliteDB.ExecSQL(utf8encode(‘Insert Into Countries (Name,Capital,Area,Pop,PCI) values ("中國","北京",9600000,1500000000,6000)‘));
在有更好的方法之前,我們只能這麼用……
file8: Blob Blob Blob
某些時候,我們會需要向資料庫中儲存和讀取圖片,視頻,音頻等資訊的資料,例如:前女友們的性感照片。sqlite中有一種資料類型叫做Blob,可以滿足我們的要求。如何訪問和讀取呢?
下面以在database.db資料庫中PhotoLib表格中存取一個JPEG圖片為例:
CREATE TABLE "PhotoLib" (Id Integer NOT NULL PRIMARY KEY UNIQUE,
Photo BLOB);
寫入:
var
SqliteDB: TSQLiteDatabase;
FS: TFileStream;
begin
SqliteDB:=TSQLiteDatabase.Create(‘database.db‘);
FS := TFileStream.Create(‘test.jpeg‘,fmOpenRead);
SqliteDB.UpdateBlob(‘UPDATE PhotoLib set Photo = ? WHERE ID = 1‘,FS);
FS.free;
SqliteDB.Free;
end;
讀取至TImage控制項顯示:
var
MS: TMemoryStream;
PIC: TJPegImage;
SqliteDB: TSQLiteDatabase;
SqliteTB: TSQLIteTable;
begin
SqliteDB:=TSQLiteDatabase.Create(‘database.db‘);
SqliteTB:=SqliteDB.GetTable(‘Select * From PhotoLib Where Id=1‘);
MS := SqliteTB.FieldAsBlob(SqliteTB.FieldIndex[‘photo‘]);
if (MS = nil) then
begin
showmessage(‘該條記錄沒有前女友照片資料.‘);
exit;
end;
MS.Position := 0;
PIC := TJPEGImage.Create;
PIC.LoadFromStream(ms);
self.Image2.Picture.Graphic := PIC;
MS.free;
PIC.Free;
end;
delphi與sqlite