SQLITE 是小型高效能的單機版資料庫, 評估後拿來當作 pos 上可單機獨立作業的 LOCAL 端單機資料庫非常適合, 之前在 WINDOWS 下我用 PARADOX 或 ACCESS , 在 LINUX 下我就用 SQLITE ( 應該比 LAZARUS 內建的單機資料庫 DBF 更好用) , 使用 SQLITE 後, 當然要為它寫一個可以瀏覽內容的工具 , 順便透過工具程式開發的練習瞭解 LAZARUS 資料庫物件有哪些特性或 BUG 限制 , 以後真正寫 pos 系統或其他程式時可以瞭解這些特性跟避開既有的 BUG
在 Linux 中安裝 sqlite3 資料庫環境
All required headers come with Lazarus+fpc. Problem is that there is no libsqlite3.so in system.
Basically it all depends on system but in general you must type as root (network connection required):
On Debian/Ubuntu like systems: apt-get install sqlite3
On RedHat and other yum based: yum install sqlite3
On openSUSE: zypper install sqlite3
安裝資料庫 (以 ubuntu 10.04 之 Linux 環境下為例)
apt-get install sqlite3
裝完, 為 libsqlite3.so.0.8.6 (視安裝版本而有不同) 做個 symbo link (libsqlite3.so), 這樣 Lazarus 程式就可執行 sqlite3 相關的資料庫操作
sudo ln -s /usr/lib/libsqlite3.so.0.8.6 libsqlite3.so
列出 DATABASE 內所有 TABLE (程式畫面中左邊的部份)
select * from sqlite_master where type='table' order by name
列出某 TABLE 的 SCHEMA
select sql from sqlite_master where type='table' and name='某 TABLE'
p.s. 在工具程式的左邊 TABLE LIST 中, 在任一 TABLE 上按滑鼠右鍵, 有 SCHEMA 功能, 可以倒出該 TABLE 的結構, 就是執行這段 SQL
要讓 SQLQuery1.RecordCount 取出的記錄筆數正確
SQLQuery1.PacketRecords:=-1; //要設定這個屬性
執行 DROP TABLE 或 CREATE TABLE 的 SQL 語句時要用到 SQLTransaction 物件
posSQLQuery1.Close;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Text:='你的 SQL 語句';
//SQLite DROP 跟 CREATE TABLE 要用到 Transaction, 否則無法真實寫入
if not SQLTransaction1.Active then SQLTransaction1.StartTransaction;
SQLQuery1.ExecSQL;
SQLTransaction1.Commit;
要可以在 DBGRID 物件上直接新增或編輯資料 (程式畫面中右下邊的物件)
1.TABLE 要設 PRIMARY KEY
2.或許是 LAZARUS 的 BUG, 我需在 SQLQuery1 的下面兩個事件中加入 CODE
procedure TForm1.SQLQuery1Beforepost(DataSet: TDataSet);
begin
SQLQuery1.UpdateMode:=upWhereKeyOnly;
end;
//這樣才能在 dbgrid 中編輯資料
procedure TForm1.SQLQuery1Afterpost(DataSet: TDataSet);
var row_idx: integer;
begin
row_idx:=SQLQuery1.RecNo;
try
SQLQuery1.ApplyUpdates;
SQLTransaction1.Commit;
except
SQLTransaction1.Rollback;
end;
SQLQuery1.Open;
SQLQuery1.First;
SQLQuery1.MoveBy(row_idx-1);
end;
要可以在 DBGRID 物件上直接按 CTRL+DELETE 刪除一筆資料 (程式畫面中右下邊的物件)
pos1.TABLE 要設 PRIMARY KEY
2.或許是 LAZARUS 的 BUG, 我需在 SQLQuery1 的下面兩個事件中加入 CODE
procedure TForm1.SQLQuery1BeforeDelete(DataSet: TDataSet);
begin
SQLQuery1.UpdateMode:=upWhereAll;
end;
//這樣才能在 dbgrid 中刪除資料
procedure TForm1.SQLQuery1AfterDelete(DataSet: TDataSet);
var row_idx: integer;
begin
row_idx:=SQLQuery1.RecNo;
try
SQLQuery1.ApplyUpdates;
SQLTransaction1.Commit;
except
SQLTransaction1.Rollback;
end;
SQLQuery1.Open;
SQLQuery1.First;
if (row_idx-1)>(SQLQuery1.RecordCount-1) then
SQLQuery1.Last
else
SQLQuery1.MoveBy(row_idx-1);
end;
使用 SQLITE 遇到的其它問題
pos不曉得是 Lazarus 元件 BUG 還是 SQLITE3 本身不支援 NVARCHAR 型態, 在 CREATE TABLE 時只能宣告 VARCHAR 型態, 遇到有放中文字的欄位, 欄位要加大一些(尤其是中文字塞滿整個欄位長度的情況下), 否則尾端中文字會變亂碼
P.S. 可以把 VARCHAR 型態宣告為原本的兩倍長度以取代 NVARCHAR , 例如 NAME 這個欄位原本預計要放五個中文字(10 個 BYTE), 在 UNICODE 情況下應該宣告為 NAME NVARCHAR(10) , 但因 Lazarus 元件 不能使用 NVARCHAR 型態 (會出現 UNKNOWN DATA TYPE 錯誤), 我們又一定要可以存放五個中文字的 UNICODE, 此時可宣告為 NAME VARCHAR(20)
------------------------------------------------------------------------------------------------------------------------
■ 相關參考
兩種單機版資料庫簡介與使用- DBF 與 SQLite
http://tw.myblog.yahoo.com/bruce0829/article?mid=29&prev=30&next=28&l=a&fid=5
------------------------------------------------------------------------------------------------------------------------
■ 程式下載 (含 source code)
http://digitraveler.homelinux.com/down_load/LazSqlLiteTool(Linux).zip
P.S.
1.因圖中呈現資料為我客戶商業資料, 不能釋出, 所以下載中 posDB.SDB 內只有空的資料結構
2. 在 WINDOWS 下使用 SQLITE 更簡單, 只要把 sqlite3.dll (下載中有附 , Linux 版不用這個 dll 檔 ) 跟你的執行檔放在同一目錄即可使用, 連安裝都不必 , LAZARUS 是跨平台的, 把本工具改成 WINDOWS 版的不用一分鐘 ...
留言列表