2015年12月7日 星期一

Lazarus 系列–4. 連接資料庫

在 Lazarus 的世界裡,沒有 BDE、ADO、dbExpress 等 Delphi 世界裡的資料庫連接方式,內建的是 SQLdb。除了 SQLdb 之外,有一些第三方的資料庫元件廠商也推出了給 Lazarus 使用的連接元件,今天不談第三方元件,專談 SQLdb。

SQLdb 支援的範圍很廣,涵蓋了經常使用的各種資料庫,包括 MSSQL、MySQL、SyBase、PostgreSQL、Oracle、Interbase、SQLite 等,如果超過這些資料庫的範圍,還可以用 ODBC 來連接。而 SQLdb 的底層呼叫的則是各家資料庫提供的原生連接函式庫 (MSSQL 除外,底下會詳細說明)。

底下這張圖是 SQLdb 元件盤上的元件,其實可以完全只用前四個,後面的大多是各家資料庫專屬的連線元件以及管理元件,如果只需要做 CRUD 就可以不用管那些元件,而 CRUD 這四個動作幾乎已經涵蓋資料庫操作的 9 成以上了。

2015-12-06_023943

前四個元件由左而右分別是:

  1. SQLQuery:處理 CRUD 主要的元件
  2. SQLTransaction:處理 transaction 的元件,必要
  3. SQLScript:執行 SQL script 的元件
  4. SQLConnector:連接資料庫的元件,必要

其他的元件說明就請參照官網了。

 

剛才說到,SQLdb 的底層呼叫的是各家資料庫提供的原生連接函式庫,以在 Windows 平台上的 PostgreSQL 為例,呼叫的是 libpq.dll,一個比較方便的方法是下載 [easy_db_plus.zip],這是一個 demo 連結 PostgreSQL 的程式,解開之後,把所有的 dll 檔複製進 Lazarus 的安裝目錄以及你的專案目錄就可以了。

而 MSSQL 的狀況則不同,SQLdb 呼叫的並不是原生的 SQL Server Native Client,而是 dblib.dll,到 [這裡] 下載 dblib_current.zip 並解壓縮之後,將 dblib_XXXX.dll 以及 libiconv2.dll 複製進 Lazarus 的安裝目錄以及你的專案目錄,然後將 dblib_XXXX.dll 改名為 dblib.dll 就可以了。
(看你要連那一個版本的 MSSQL,目前是到 dblib_2008.dll,拿這個連 MSSQL 2012 也可以的)

 

接下來就以 MSSQL 為例子示範如何連接資料庫,並完成一個簡單的 CRUD 應用程式

  1. 放一個 SQLTransaction
  2. 放一個 SQLConnector,設定以下屬性:
    • Transaction 設定為 SQLTransaction1
    • ConnectorType 設定為 MSSQLServer
  3. 放一個 SQLQuery,設定以下屬性:
    • Database 屬性設定為 SQLConnector1,這時你可以觀察到 SQLQuery.Transaction 屬性也自動的被設定為 SQLTransaction1
    • PacketRecords 屬性設定為 -1 (MSSQL必須,其他資料庫可保持為預設值 10)
  4. 放一個 DataSource,設定以下屬性:
    • 設定 DataSet 屬性為 SQLQuery1
  5. 放一個 DbGrid,設定以下屬性:
    • 設定 DataSource 屬性為 DataSource1
  6. 放一個按鈕,撰寫 OnClick 事件如下:

    // 請將黃色字替換成你實際要用的值,可用 :port 來指定 MSSQL 偵聽的 port 號
    SQLConnector1.Close;
    SQLConnector1.HostName := '127.0.0.1';   
    SQLConnector1.DatabaseName := 'DB1';
    SQLConnector1.UserName := 'username';
    SQLConnector1.Password := 'password';
    SQLConnector1.Open;
    SQLQuery1.SQL.Text := 'SELECT * FROM TABLE1';
    SQLQuery1.Open;
  7. 編譯,執行,按下 Button1,若順利的話,可以看到 DbGrid 出現資料。如果出現連接失敗的訊息,請檢查 MSSQL 是否開啟了 TCP/IP 連線,以及 TCP 偵聽的 port 號

剛才完成的只有 CRUD 中的 R,接下來繼續完成 CUD 三部分

  1. 再放一個按鈕,撰寫 OnClick 事件如下:

    try
      SQLQuery1.ApplyUpdates;
      SQLTransaction1.CommitRetaining;
    except
      SQLTransaction1.RollbackRetaining;
      SQLQuery1.CancelUpdates;
    end;
  2. 編譯,執行,按下 Button1,在 DbGrid 上做新增、修改、刪除等動作,然後按 Button2,再去檢查資料,就發現資料已經異動了。
  3. 這種方法必須仰賴 table 本身有 primary key,才能正確的做出異動動作

但是如果 table 沒有 primary key,要如何做呢?SQLQuery 除了 SQL 屬性之外,還有 InsertSQL、UpdateSQL、DeleteSQL 三個屬性,請分別給這三個屬性設定正確的新增、修改、刪除的 SQL 敘述,參數部分用 : 開頭,原值參數用 :OLD_ 開頭 (必須是大寫)

需要更詳細的說明,請參閱 [官網]

這一期就講到這裡,下期再見

2 則留言:

Eden 提到...

感覺回到那個美好的 BDE 時代!

貓老大 提到...

其實比 BDE 還要簡單,弄清楚連接各種資料庫需要什麼 dll,就只是 copy and paste 的功夫,連安裝都不必