Lazarus中文社区

 找回密码
 立即注册(注册审核可向QQ群索取)

QQ登录

只需一步,快速开始

Lazarus IDE and 组件 下载地址版权申明
查看: 8621|回复: 7

兩種單機版資料庫簡介與使用- DBF 與 SQLite

[复制链接]

该用户从未签到

发表于 2010-9-26 13:49:37 | 显示全部楼层 |阅读模式



分類: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

评分

参与人数 1威望 +6 收起 理由
猫工 + 6 谢谢分享

查看全部评分

回复

使用道具 举报

该用户从未签到

 楼主| 发表于 2010-9-26 13:52:34 | 显示全部楼层
關於
"SQLite 在DBGrid 上雖可以直接編輯, 但不會寫入檔案, DataSet 關掉再 OPEN , 資料還是舊的 ......."

以下有解答

SQLITE 資料庫瀏覽工具
http://www.fpccn.com/read.php?tid=713&fpage=2
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2010-10-21 18:52:40 | 显示全部楼层
不错,学习了,谢谢!
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2010-10-27 13:32:58 | 显示全部楼层
留下记号,慢慢消化!
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-8-2 21:33:33 | 显示全部楼层
很不错的初学者教程!
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2012-2-14 20:27:19 | 显示全部楼层
很不错的初学者教程!
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2014-3-23 02:03:08 | 显示全部楼层
过期链接都是失效了...
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2017-3-1 22:40
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2014-11-27 22:16:39 | 显示全部楼层
    &#39是啥意思?
    回复 支持 反对

    使用道具 举报

    *滑块验证:

    本版积分规则

    QQ|手机版|小黑屋|Lazarus中国|Lazarus中文社区 ( 鄂ICP备16006501号-1 )

    GMT+8, 2025-5-2 09:39 , Processed in 0.045940 second(s), 14 queries , Redis On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表