作者: 蔡煥麟
日期: Jan-6-1999, Mar-2-1999, May-20-1999, Oct-9-1999
在以 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# |
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 存取則沒有這個問題. |