sqlite與delphi

來源:互聯網
上載者:User

       之前在公司中編寫了一個webservice服務,通過調用服務,才能繼續後續操作其中webservice中自己做了cookie的儲存以及session的處理,當時的session是通過hash儲存的,但是後來在並發測試中發現會出現有hash是找不到的,後來在網上查了資料才知道是由於webmoudle的處理導致的建立了多個hash,最紅找錯了對象導致的,後來將hash完全儲存為一個唯一的對象,解決了這個問題,不過最近在iis中發布後,為了提高效率將iis的進程數調整到了10個,結果又出現了類似的情況,現在就行將hash中維護的值,進行真正的唯一化,所以想使用sqlite處理。

       簡單介紹一下sqlite:

       SQLite,是一款輕型的資料庫,是遵守ACID的關聯式資料庫管理系統,它的設計目標是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,它佔用資源非常的低,在嵌入式裝置中,可能只需要幾百K的記憶體就夠了。它能夠支援Windows/Linux/Unix等等主流的作業系統,同時能夠跟很多程式語言相結合,比如 Tcl、C#、PHP、Java等,還有ODBC介面,同樣比起Mysql、PostgreSQL這兩款開源世界著名的資料庫管理系統來講,它的處理速度比他們都快。

         不像常見的客戶-伺服器範例,SQLite引擎不是個程式與之通訊的獨立進程,而是串連到程式中成為它的一個主要部分。所以主要的通訊協定是在程式設計語言內的直接API調用。這在消耗總量、延遲時間和整體簡單性上有積極的作用。整個資料庫(定義、表、索引和資料本身)都在宿主主機上儲存在一個單一的檔案中。它的簡單的設計是通過在開始一個事務的時候鎖定整個資料檔案而完成的。

        SQLite的資料類型

  首先你會接觸到一個讓你驚訝的名詞: Typelessness(無類型). 對! SQLite是無類型的. 這意味著你可以儲存任何類型的資料到你所想要儲存的任何錶的任何列中, 無論這列聲明的資料類型

是什麼(只有在一種情況下不是, 稍後解釋). 對於SQLite來說對欄位不指定類型是完全有效. 如:

  Create Table ex1(a, b, c);

  誠然SQLite允許忽略資料類型, 但是仍然建議在你的Create Table語句中指定資料類型. 因為資料類型對於你和其他的程式員交流, 或者你準備換掉你的資料庫引擎時能起到一個提示或協助的作用. SQLite支援常見的資料類型, 如:

  CREATE TABLE ex2( a VARCHAR(10), b NVARCHAR(15), c TEXT, d INTEGER, e FLOAT, f BOOLEAN, g CLOB, h BLOB, i TIMESTAMP, j NUMERIC(10,5), k VARYING CHARACTER (24), l NATIONAL VARYING CHARACTER(16) );

  前面提到在某種情況下, SQLite的欄位並不是無類型的. 即在欄位類型為”Integer Primary Key”時.

        SQLite雖然很小巧,但是支援的SQL語句不會遜色於其他開來源資料庫,它支援的SQL包括:

  ATTACH DATABASE

        BEGIN TRANSACTION

  comment

  COMMIT TRANSACTION

  COPY

  CREATE INDEX

  CREATE TABLE

  CREATE TRIGGER

  CREATE VIEW

  DELETE

  DETACH DATABASE

  DROP INDEX

  DROP TABLE

  DROP TRIGGER

  DROP VIEW

  END TRANSACTION

  EXPLAIN

  expression

  INSERT

  ON CONFLICT clause

  PRAGMA

  REPLACE

  ROLLBACK TRANSACTION

  SELECT

  UPDATE 。

delphi如何使用sqlite呢?請看下面的簡單的例子:

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。

2 、準備工作part2

      建立一個表單應用程式工程,並設定儲存的檔案夾。將simple sqlite 3.0 for delphi 中的 sqlite3.pas,sqlite3table.pas,sqlite3udf.pas拷貝至工程所在的檔案夾。並在工程中添加這三個檔案。拷貝 sqlite.dll到編譯產生exe檔案的檔案夾。
3、初步測試

      引用SQLiteTable3.pas單元。

在表單上建立一個叫btnVersion的按鈕(Tbutton)。在btnVersion的click事件中寫入下面的代碼。

procedure TfrmAbout.btnVersionClick(Sender: TObject);varSqliteDB:TSQLiteDatabase;beginSqliteDB:=TSQLiteDatabase.Create('');showmessage('Sqlite dll version:'+SqliteDb.version);SqliteDB.Free;end;

      編譯運行,成功的話,將會顯示當前的sqlite dll的版本號碼。

4 、簡單工作原理描述

      在simple sqlite3.0 for delphi的幾個檔案中,主要用到兩個檔案。分別是sqlite3.pas,sqlite3table.pas。

      sqlite3.pas實現sqlite.dll的介面外部定義。

      sqlite3table.pas進行簡單的訪問函數封裝。

      在delphi中,通過sqlite3table.pas來實現對sqlite資料庫的各種訪問。

     關於sqlite3udf.pas,根據作者的描述,主要用與建立使用者自訂函數,具體功能未測試。

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的資料。

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的單引號標記。
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)'));

 在有更好的方法之前,我們只能這麼用……

8、 Blob 

      某些時候,我們會需要向資料庫中儲存和讀取圖片,視頻,音頻等資訊的資料,例如:前女友們的性感照片。sqlite中有一種資料類型叫做Blob,可以滿足我們的要求。如何訪問和讀取呢?

下面以在database.db資料庫中PhotoLib表格中存取一個JPEG圖片為例:

CREATE TABLE "PhotoLib" (Id Integer NOT NULL PRIMARY KEY UNIQUE, Photo BLOB);寫入:varSqliteDB: TSQLiteDatabase;FS: TFileStream;beginSqliteDB:=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控制項顯示:varMS: TMemoryStream;PIC: TJPegImage;SqliteDB: TSQLiteDatabase;SqliteTB: TSQLIteTable;beginSqliteDB:=TSQLiteDatabase.Create('database.db');SqliteTB:=SqliteDB.GetTable('Select * From PhotoLib Where Id=1');MS := SqliteTB.FieldAsBlob(SqliteTB.FieldIndex['photo']);if (MS = nil) thenbeginshowmessage('該條記錄沒有前女友照片資料.');exit;end;MS.Position := 0;PIC := TJPEGImage.Create;PIC.LoadFromStream(ms);self.Image2.Picture.Graphic := PIC;MS.free;PIC.Free;end;

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.