close



 

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 物件

pos

SQLQuery1.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 刪除一筆資料  (程式畫面中右下邊的物件)

pos

1.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 版的不用一分鐘 ...

arrow
arrow
    創作者介紹
    創作者 burgesmalid48 的頭像
    burgesmalid48

    burgesmalid48的部落格

    burgesmalid48 發表在 痞客邦 留言(0) 人氣()