Delphi 3/4 存取 Access 資料庫心得整理

作者: 蔡煥麟
日期: Jan-6-1999, Mar-2-1999, May-20-1999, Oct-9-1999

一. 以 BDE 的 MSACCESS 原生驅動程式連接 Access97 資料庫

在以 Delphi 程式存取 Access97 資料庫之前必須先確定 BDE Administrator 中 MSACCESS driver 的參數必須設定正確。

執行 BDE Administrator, 點選 Configuration 頁籤, 展開並移至 Configuration\Drivers\Native\MSACCESS, 右方 Definition 頁籤會顯示資料如下:

VERSION 1.0
TYPE SERVER
DLL32 IDDA3532.DLL
DRIVER FLAGS  
TRACE MODE 0
DATABASE NAME DRIVE:/PATH/DATABASE.MDB
LANGDRIVER  
OPEN MODE READ/WRITE
SYSTEM DATABASE  
USER NAME  

註: DLL32 這個欄位的值如果是 IDDAO32.DLL 表示您的系統有 DAO 3.0 版的 driver, 要存取 Access97 資料庫必須將此欄位設為 IDDA3532.DLL。


以下提供兩個方法讓 Delphi 程式可以連接 Access 資料庫, 你可以自行測試之, 前提是之前所提的 MSACCESS 驅動程式的參數要設定正確, 以及, 你得事先建立好一個 Access 資料庫 (利用 Microsoft Access97)。

方法一: 以建立 Alias 的方式連接

執行 BDE Administrator, 點選 Database 頁籤, 建立一個新的 Alias, 當詢問 Database driver name 時, 選擇 MSACCESS, 按[Ok], 輸入這個 Alias 的名稱, 然後在右方 Definition 頁籤當中的 DATABASE NAME 欄位輸入您要存取的 Access97 資料庫檔名(要包含完整路徑), 最後點選主功能表的 Object|Apply 以儲存新增加的 Alias。

然後你便可以在你的 Delphi 程式中透過這個 Alias 連接 Access 資料庫, 就像你平時存取 DBASE 資料表一樣。


方法二: 利用 TDatabase 元件 (不需要用 BDE Administrator 建立 Alias)

Step 1: 執行 Delphi, New 一個 Application, 在 Form1 上放置 TDatabase, TTable 各一個

Step 2: 以滑鼠雙擊 Database1 兩下, 會開啟 TDatabase 元件的屬性編輯器, 輸入以下資料:

Name 輸入 TestAccessDB
DriverName 輸入 MSACCESS
Login prompt 不要勾選 (除非你要每次連接時都輸入使用者名稱及密碼)

然後以滑鼠雙擊 Defaults 按鈕, 便會自動產生資料庫連接時的內定參數, 如下圖:

 

 

 

 

 

 

 

 

 

你可以修改 Parameter overrides 裡面的 DATABASE NAME=你要存取的Access資料庫檔案, 例如: DATABASE NAME=c:\test\test.mdb

或者用程式來動態指定(更好):

Database1.Connected := false;
Database1.Params.Values['DATABASE NAME] := 'c:\test\test.mdb';
Database1.Connected := true;

Step 3: 把 Table1 的 DatabaseName 設定為 TestAccessDB, 然後設定好 TableName, 將 Table1 的 Active 屬性設為 TRUE 看看, 如果成功的話 Table1 便會在 Active (開啟) 狀態下, 你可以再放一個 DataSource 和 DBGrid 來觀看實際的資料。


二. 注意事項

Ansi-SQL Jet-SQL
% *
_ ? (ACCESS 似乎有處理 double byte, 因為一個 '?' 代表一個中文字)
mm/dd/yyyy #mm/dd/yyyy#

FAQ

Q: 如何避免資料庫 login 對話盒出現?
A: 使用 TDatabase 來連接資料庫 (詳見上文), 並設定 TDatabase.LoginPrompt := false
Q: 新增資料完畢要 Post 時出現錯誤 'At beginning of table' ?
A: 這個錯誤通常出現於用 TTable 新增一筆記錄至一個空的資料表, 要 Post 時就會出錯, 而 TQuery 則沒有這個問題, 解決方法是在新增記錄前先以 TTable.IsEmpty 判斷資料表是否為空, 如果是的話就呼叫 TTable.Edit ( TTable.Insert 也行), 否則呼叫 TTable.Append。

註: Delphi4+BDE5.01仍有此問題存在

Q: 以 ODBC driver 存取 Access 資料庫時, 資料表的 Boolean 欄位無論用什麼方法讀出來都是 FALSE?
A: 如果資料集物件的 CachedUpdates 屬性設定為 TRUE 就一切正常, 原因未知. 而以原生 MSACCESS driver 存取則沒有這個問題.
1