delphi與sqlite

來源:互聯網
上載者:User

標籤:

 

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.