delphi 與 sqlite 參考

轉自:http://www.cnblogs.com/jxsoft/archive/2012/06/02/2532273.html

本文的目的在於採用流水賬方式來記錄學習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;

發佈了58 篇原創文章 · 獲贊 22 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章