【delphi】delphi操做sqlite3

SQLite

  SQLite是一個老牌的輕量級別的本地文件數據庫,徹底免費且開源,不須要安裝,無須任何配置,固然,這樣管理功能就不是很強大了,可是它的主要應用也是在本地數據庫,能夠說是最簡單好用的嵌入式本地數據庫了。sql

  SQLite只要一個DLL就能夠實現所有功能。SQLite不須要數據庫引擎,只有一個數據文件,佔用系統資源很是少,很適合作Demo或小型應用。數據庫

  同時,SQLite也是關係型數據庫,支持大部分SQL語句。它支持事務機制和blob數據類型,支持大部分SQL92標準,最大支持數據庫到2T。app

  它還有Python、Tcl、PHP、Java的綁定,這些語言能夠直接使用SQLite數據庫,由於它們自身包含了支持;還有ODBC接口,很是方便使用。ide

  SQLite的一些基本操做跟SQL很相似,基本上有SQL基礎的都能看明白。函數

  SQLite的圖像查看工具備不少,好比SQLiteSpy、SQLiteBrowser等。工具

  SQLite默認是utf8編碼,使用pragma encoding能夠看出數據庫的編碼。測試

  創建數據庫後,能夠直接輸入「pragma encoding = UTF8/UTF16」來改變編碼,但數據庫有了數據之後,編碼是不能夠修改的。編碼

  SQLite的源碼能夠http://www.sqlite.org得到。關於SQLite的更進一步的語法和信息,請參http://www.sqlite.com.cn/http://www.sqlitecn.orgspa

 


delphi中使用sqlite3

  這裏有一個delphi中使用sqlite3的demo:http://www.itwriting.com/blog/articles/a-simple-delphi-wrapper-for-sqlite-3/comment-page-2code

  這個demo中包含了sqlite3.passqlite3table.pas,sqlite.dll三個文件,裏面包含了操做sqlite3的源代碼,利用這三個文件,就不須要第三方組件了

添加步驟:

  1. 將simple sqlite 3.0 for delphi 中的 sqlite3.pas,sqlite3table.pas拷貝至工程所在的文件夾。並在工程中添加這兩個個文件。
  2. 拷貝 sqlite.dll到編譯生成exe文件的文件夾。這個根據我的的設定。

初步測試 

  1. 引用SQLiteTable3.pas單元
  2. 在窗體上建立一個叫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的版本號

簡單工做原理描述

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

  1. sqlite3.pas實現sqlite.dll的接口外部定義。
  2. sqlite3table.pas進行簡單的訪問函數封裝。

  在delphi中,經過sqlite3table.pas來實現對sqlite數據庫的各類訪問

讀寫數據

  有一個叫作test.db的sqlite數據庫文件,在編譯生成的exe文件所在的目錄。裏面有一個叫作testTable的表格。

  下面是根據demo提練出來的讀寫語句:

 1 unit TestSqlite;
 2 
 3 interface
 4 
 5 uses
 6   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 7   Dialogs, StdCtrls, SQLiteTable3;
 8 
 9 type
10   TForm1 = class(TForm)
11     lbl1: TLabel;
12     ebID: TEdit;
13     ebName: TEdit;
14     lbl2: TLabel;
15     lbl3: TLabel;
16     ebNumber: TEdit;
17     memNotes: TMemo;
18     btnTest: TButton;
19     procedure btnTestClick(Sender: TObject);
20   private
21     { Private declarations }
22   public
23     { Public declarations }
24   end;
25 
26 var
27   Form1: TForm1;
28 
29 implementation
30 
31 {$R *.dfm}
32 
33 procedure TForm1.btnTestClick(Sender: TObject);
34 var
35   slDBpath: string;
36   sldb: TSQLiteDatabase;
37   sltb: TSQLIteTable;
38   sSQL: String;
39   Notes: String;
40 
41 begin
42   slDBPath := ExtractFilepath(application.exename)
43   + 'test.db';
44   sldb := TSQLiteDatabase.Create(slDBPath);
45   try
46     if sldb.TableExists('testTable') then
47     begin
48       sSQL := 'DROP TABLE testtable';
49       sldb.execsql(sSQL);
50     end;
51 
52     sSQL := 'CREATE TABLE testtable ([ID] INTEGER PRIMARY KEY,[OtherID] INTEGER NULL,';
53     sSQL := sSQL + '[Name] VARCHAR (255),[Number] FLOAT, [notes] BLOB, [picture] BLOB COLLATE NOCASE);';
54     sldb.execsql(sSQL);
55     sldb.execsql('CREATE INDEX TestTableName ON [testtable]([Name]);');
56 
57     //begin a transaction
58     sldb.BeginTransaction;
59     sSQL := 'INSERT INTO testtable(Name,OtherID,Number,Notes) VALUES ("Some Name",4,587.6594,"Here are some notes");';
60     //do the insert
61     sldb.ExecSQL(sSQL);
62     sSQL := 'INSERT INTO testtable(Name,OtherID,Number,Notes) VALUES ("Another Name",12,4758.3265,"More notes");';
63     //do the insert
64     sldb.ExecSQL(sSQL);
65     //end the transaction
66     sldb.Commit;
67     //  緣由:它以文件的形式存在磁盤中,每次訪問時都要打開一次文件,若是對數據庫進行大量的操做,就很慢。
68     //  解決辦法:用事物的形式提交,由於開始事務後,進行的大量操做語句都保存在內存中,
69     //  當提交時才所有寫入數據庫,此時,數據庫文件也只用打開一次。若是操做錯誤,還能夠回滾事務。
70 
71     //query the data
72     sltb := sldb.GetTable('SELECT * FROM testtable');
73     try
74         if sltb.Count > 0 then
75         begin
76 
77         //display first row
78         //display second row
79         //sltb.Next;
80         ebName.Text := sltb.FieldAsString(sltb.FieldIndex['Name']);
81         ebID.Text := inttostr(sltb.FieldAsInteger(sltb.FieldIndex['ID']));
82         ebNumber.Text := floattostr( sltb.FieldAsDouble(sltb.FieldIndex['Number']));
83         Notes :=  sltb.FieldAsBlobText(sltb.FieldIndex['Notes']);
84         memNotes.Text := notes;
85         end;
86 
87     finally
88         sltb.Free;
89     end;
90 
91   finally
92     sldb.Free;
93   end;
94 end;
95 
96 end.
View Code
相關文章
相關標籤/搜索