|
分類:Win32 版本
簡介
資料庫在處理大量的資料上是必需的,但如果資料固定且量不多,或是資料庫只會在單機上使用,且沒有讓多人使用的需求的話 (像是收銀機自己的商品主檔 , 販促主檔, 專櫃主檔等等),就不一定需要特別架一個大型資料庫系統;因此,可以使用類似 DBF 或是SQLite 這樣的嵌入式資料庫(embedded SQL database) ( 註 : Borland 旗下開發工具如 Delphi 或 BCB 是使用一種叫 Paradox 的小型資料庫當單機版桌上型資料庫, 當然也可使用 DBASE 或 MS Access ; 但 Lazarus 並不支援 Paradox 及 Ms Access, 若硬要透過 ODBC 連 Paradox 及 Ms Access 仍有很多 BUG )
DBF 檔案格式的資料庫系統在早期 DOS 時代用的很頻繁, 當時的開發工具如 DBASE , FOXPRO, CLIPPER 等都是用 DBF 或加強版的 DBF 資料格式為單機資料庫, 統稱為 XBASE 系統
如果習慣透過 SQL 語法來讀寫資料庫, 可已使用 SQLite, 它與其他一般資料庫(如 ORACLE , MS SQL SERVER 等等 ) 使用差異不大,一般的 SQL-92 語法都能夠使用,而且不需要建立一個資料庫系統,要使用的時候,只要在編譯程式的時候將 SQLite 程式庫一起編入就可以使用。另外,SQLite 的資料庫(database)都是以單一檔案的形式存於磁碟中,不需要再安裝資料庫伺服器軟體,所以要把資料庫複製或建立在你的電腦上是相單簡單快速。SQLite 是一個很小的 C 語言程式庫,且本身就完全包含資料庫引擎的功能,而且可以嵌入至其他程式中,完全不用額外的設定
控件 (Component)
Lazarus 中 TDbf 控件就是用來連結 DBF 檔案格式 , 而 TSQLite3Connection 就是用來連結 SQLite 資料
連結資料表方式
註 : AnsiToUtf8() 及 Utf8ToAnsi() 等轉碼函式定義在 LCLProc 單元中, 所以要先 uses LCLProc 這個單元, 否則編譯器會不認得 AnsiToUtf8() 及 Utf8ToAnsi()
[DBF]
procedure TForm1.FormCreate(Sender: TObject);
var My_Path:string;
begin
My_Path:=ExtractFilePath(Application.ExeName); //ExtractFilePath() 取回的是 ANSI, 要改為 UTF8
Dbf1.TableName:=My_Path+'BX_ADAY.DBF'; //TDbf 的 TableName 要餵入 ANSI STRING
Dbf1.Active:=true;
end;
[SQLite]
使用 TSQLite3Connection 控件時還要同時加入 TSQLTransaction 及 TSQLQuery 兩個控件
procedure TForm1.FormCreate(Sender: TObject);
var My_Path:string;
begin
//將 SQLTransaction1 及 SQLQuery1 兩個控件之 Database 指到 SQLite3Connection1
SQLTransaction1.Database:=SQLite3Connection1;
SQLQuery1.Database:=SQLite3Connection1;
My_Path:=ExtractFilePath(Application.ExeName); //ExtractFilePath() 取回的是 ANSI, 要改為 UTF8
My_Path:=ansitoutf8(My_Path); //改為 UTF8
SQLite3Connection1.DatabaseName:=My_Path+'myTest.db'; //指定一個 DATABASE
SQLite3Connection1.Connected:=true;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('select * from demo'); //指定一個 TABLE 名稱
SQLQuery1.Active:=true;
end;
新增資料 (APPEND)
[DBF]
procedure TForm1.Button1Click(Sender: TObject);
begin
Dbf1.Append();
Dbf1.FieldByName('VAD_COMPAN').AsString:='1';
Dbf1.FieldByName('VAD_TENANT').AsString:='中文1';
Dbf1.Post;
Dbf1.Append();
Dbf1.FieldByName('VAD_COMPAN').AsString:='1';
Dbf1.FieldByName('VAD_TENANT').AsString:='中文2';
Dbf1.Post;
Dbf1.Append();
Dbf1.FieldByName('VAD_COMPAN').AsString:='1';
Dbf1.FieldByName('VAD_TENANT').AsString:='中文3';
Dbf1.Post;
Dbf1.Append();
Dbf1.FieldByName('VAD_COMPAN').AsString:='1';
Dbf1.FieldByName('VAD_TENANT').AsString:='中文4';
Dbf1.Post;
Dbf1.Append();
Dbf1.FieldByName('VAD_COMPAN').AsString:='1';
Dbf1.FieldByName('VAD_TENANT').AsString:='中文5';
Dbf1.Post;
end;
[SQLite]
procedure TForm1.Button1Click(Sender: TObject);
begin
//OPEN 中編輯的語法
if not SQLTransaction1.Active then
SQLTransaction1.StartTransaction;
SQLQuery1.Append();
SQLQuery1.FieldByName('uid').AsInteger:=1;
SQLQuery1.FieldByName('uname').AsString:='中文測試';
SQLQuery1.Post;
SQLQuery1.Append();
SQLQuery1.FieldByName('uid').AsInteger:=2;
SQLQuery1.FieldByName('uname').AsString:='中文測試二';
SQLQuery1.Post;
SQLQuery1.ApplyUpdates;
SQLTransaction1.CommitRetaining;
end;
清空資料 (EmptyTable)
[DBF]
procedure TForm1.Button2Click(Sender: TObject);
begin
Dbf1.EmptyTable;
Dbf1.Active:=false; //要加這段, DBGRID 才會 REFRESH
Dbf1.Active:=true;
end;
[SQLite]
procedure TForm1.Button2Click(Sender: TObject);
begin
//ExecSQL 的語法
if not SQLTransaction1.Active then
SQLTransaction1.StartTransaction;
SQLQuery1.Close();
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('delete from demo');
SQLQuery1.ExecSQL;
SQLTransaction1.Commit;
//重新顯示
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('select * from demo');
SQLQuery1.Active:=true;
end;
搜尋資料 (LOCATE)
註 : VarArrayOf() 定義在 variants 單元中, 所以要先 uses variants 這個單元, 否則編譯器會不認得 VarArrayOf()
[DBF]
//搜尋單一欄位 OK
Dbf1.Locate('VAD_TENANT', '中文4', [loCaseInsensitive,loPartialKey]);
//搜尋複合欄位中文有問題
//Dbf1.Locate('VAD_COMPAN;VAD_TENANT', VarArrayOf(['1', '中文4']), [loPartialKey]);
//搜尋複合欄位 無中文 OK
Dbf1.Locate('VAD_COMPAN;VAD_TENANT', VarArrayOf(['1', '444']), [loPartialKey]);
[SQLite]
//搜尋單一欄位 OK
SQLQuery1.Locate('uid', '2', [loCaseInsensitive,loPartialKey]);
//搜尋複合欄位 OK
SQLQuery1.Locate('uid;uname', VarArrayOf(['2', '中文測試二']), [loPartialKey]);
資料感知元件上的操作
[DBF]
可以在DBGrid 上直接編輯資料 (會寫入檔案)
[SQLite]
在DBGrid 上雖可以直接編輯, 但不會寫入檔案, DataSet 關掉再 OPEN , 資料還是舊的
--------------------------------------------------------------------------------------------------------------------------------------
■ 後註
1. 程式下載 (含 source code) http://digitraveler.homelinux.com/down_load/LazDeskDBTest.zip |
评分
-
查看全部评分
|