SQLite
SQLite是一個老牌的輕量級別的本地文件數據庫,完全免費且開源,不需要安裝,無須任何配置,當然,這樣管理功能就不是很強大了,但是它的主要應用也是在本地數據庫,可以說是最簡單好用的嵌入式本地數據庫了。
SQLite只要一個DLL就可以實現全部功能。SQLite不需要數據庫引擎,只有一個數據文件,占用系統資源非常少,很適合做Demo或小型應用。
同時,SQLite也是關系型數據庫,支持大部分SQL語句。它支持事務機制和blob數據類型,支持大部分SQL92標准,最大支持數據庫到2T。
它還有Python、Tcl、PHP、Java的綁定,這些語言可以直接使用SQLite數據庫,因為它們自身包含了支持;還有ODBC接口,非常方便使用。
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.org。
delphi中使用sqlite3
這里有一個delphi中使用sqlite3的demo:http://www.itwriting.com/blog/articles/a-simple-delphi-wrapper-for-sqlite-3/comment-page-2
這個demo中包含了sqlite3.pas,sqlite3table.pas,sqlite.dll三個文件,里面包含了操作sqlite3的源代碼,利用這三個文件,就不需要第三方組件了
添加步驟:
- 將simple sqlite 3.0 for delphi 中的 sqlite3.pas,sqlite3table.pas拷貝至工程所在的文件夾。並在工程中添加這兩個個文件。
- 拷貝 sqlite.dll到編譯生成exe文件的文件夾。這個根據個人的設定。
初步測試
- 引用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的版本號
簡單工作原理描述
在simple sqlite3.0 for delphi的幾個文件中,主要用到兩個文件。分別是sqlite3.pas,sqlite3table.pas。
- sqlite3.pas實現sqlite.dll的接口外部定義。
- 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.