Embarcadero RAD Studio XE2 連結 MS Access 資料庫

 

前言

ADO 處理 MS Access 還是最方便,可以連結 ODBC,也可以直接連 mdb 檔案,在 DBGrid 等資料庫感知元件中讀寫 Unicode 都很順利。

BDE 是利用 ODBC 來連結 MS Access,可以直接讀寫 DBGrid,但目前測試結果只能處理 Big5 字集,不知如何讓它支援 Unicode。

dbExpress 也是利用 ODBC 來連結 MS Access,因為 dbExpress 取消了緩衝記憶體的使用,雖然效能有提昇,但也多了一些限制,例如沒有支援編輯,因此它不能直接連結 DBGrid 等資料庫元件。若要使用,就要搭配 TClientDataSet 及 TDataSetProvider 來連結,而且也只能讀取資料,不能寫入。

總結來說,若要和 MS Access 搭配,ADO 還是最方便的工具。

說明一下,底下提到 Table,是指 TTable 元件,提到 Table1 (後面有數字)則是指該 TTable 元件的名字,其他元件依此類推。

 

 


 

使用 ADO

 

image

 

1. 以 ADOTable 為例

a. Connection 層

ADOConnection1.ConnectionString = (依程式提供精靈逐一選擇,先選 Use Connection String,再來可選擇 ODBC,最後內容為 "Provider=MSDASQL.1;Persist Security Info=False;Data Source=gaiji-m",也可選擇單一的 Access 檔案,最後主要的內容為 "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=gaiji-m.mdb")

選  Use Connection String 及 Build…

image

 

選 ODBC

 

image

 

選擇 ODBC 資料庫

 

image

 

或是選擇使用單一的 MS Access 檔案(Microsoft Jet 4.0 OLE DB Provider)

 

image

 

再選擇檔案位置,若最後是要和程式在同一個目錄,就可以省略目錄位置。

 

image

 

b. DataSet 層(採用 ADOTable)

 

ADOTable1.Connection = ADOConnection1;

ADOTable1.TableName = gaiji; // gaiji-m 裡面的某個表格

 

c. DataSource 層

 

DataSource1.DataSet = ADOTable1;

 

d. 資料庫感知元件

 

DBGrid1.DataSource = DataSource1;

 

2. 以 ADOQuery 為例

 

大致同上,差別為:

 

ADOQuery1.Connection = ADOConnection1;

ADOQuery1.SQL = "select * from gaiji”; // SQL

 

DataSource1.DataSet = ADOQuery1;

 

3. 以 ADODataSet 為例

 

ADODataSet 可以做到 Table 及 Query 的功能。

 

a. Table

 

ADODataSet1.Connection = ADOConnection1;

ADODataSet1.CommandType = cmdTable; // 使用表格模式

ADODataSet1.CommandText = “gaiji”; // 表格名稱

DataSource1.DataSet = ADODataSet1;

 

b. Query

 

ADODataSet1.Connection = ADOConnection1;

ADODataSet1.CommandType = cmdText; // 使用 SQL 模式

ADODataSet1.CommandText = "select * from gaiji”; // 下達 SQL 指令

DataSource1.DataSet = ADODataSet1;

 

4. 以 ADOCommand 為例

 

ADOCommand 最主要的用途是對資料庫系統執行新增或刪除等 SQL 敘述,它並不會將資料回傳顯示在 DBGrid 或是其他的任何顯示方式上。

 

ADOCommand1->CommandText = "...." // .... 為SQL敘述;

ADOCommand1->Execute();

 

經測試,ADOQuery 及 ADODataSet 也可以進行新增或刪除等敘述,只是意義不大,而且有些情況會跳出訊息。

 

5. 省略 Connection 層(ADOConnection)

 

ADOTable、ADOQuery、ADODataSet、ADOCommand 其實也都可以不使用 Connection 屬性來連結 ADOConnection1,而直接用 ConnectionString 屬性來連結 ODBC 或單一的 Access 檔案。

 

6. Master / Detail 架構

 

要呈現 Master / Detail 架構,Detail 該組設定方法如下:

 

ADOTable2.Connection = ADOConnection1;

ADOTable2.TableName = 表格二 ; // 另一個表格

ADOTable2.MasterSource = DataSource1; // 指向第一組的 DataSource

ADOTable2.MasterFields =(ADOTable1 與 ADOTable2 要連結的欄位)

DataSource2.DataSet = ADOTable2;

DBGrid2.DataSource = DataSource2;

 


 

使用 BDE

 

image

 

1. 以 Table 為例

 

a. Connection 層

 

Database1.DatabaseName = MyDB; // 自訂的名稱

Database1.AliasName = gaiji-m; // 要連結的 ODBC 資料庫

Database1.LoginPrompt = False; // 登入不用提醒,直接用設定值

 

如果有登錄帳號與密碼要修改,就在 TDatabase 元件點二下,在 Parameter overrides: 欄位的 Defaults 按鈕按下去,會有預設的參數,再寫上適當的帳號及密碼。

 

image

 

看它的設定,似乎也可以不使用 ODBC,而採用 Drive 的方式來連結單一的 MS Access 檔案,但我沒有試成功。

b. DataSet 層(採用 Table)

 

Table1.DatabaseName = MyDB; // TDatabse 中自訂的名稱

Table1.TableName = gaiji; // ODBC 中 gaiji-m 的表格

 

c. DataSource 層

 

DataSource1.DataSet = Table1;

 

d. 資料庫感知元件

 

DBGrid1.DataSource = DataSource1;

 

2. 以 Query 為例

 

大致同上,差別為:

 

Query1.DatabaseName = MyDB; // TDatabse 中自訂的名稱

Query1.SQL = "select * from gaiji"; // SQL

DataSource1.DataSet = Query1;

 

3. 省略 Connection 層(Database)

 

上述的 Table 及 Query 元件也可以省略 Connection 層的 Database 元件,只要在 DatabaseName 屬性直接連結 ODBC 資料庫即可,不過如此一來每次連結就會詢問帳號及密碼,因為 DataBase 元件才有 LoginPrompt 的屬性可以用來取消。

 


 

使用 dbExpress

 

dbExpress 和上面比較起來,比較特別的是因為 dbExpress 取消了緩衝記憶體的使用,它不能直接連結 DBGrid 等資料庫元件,若要使用,就要搭配 TClientDataSet 及 TDataSetProvider 來連結,而且也只能讀取資料,不能寫入。

 

image

 

1. 以 SQLTable 為例

 

a. Connection 層

 

SQLConnection1.ConnectionName = OdbcConnection;

SQLConnection1.Driver = Odbc; // 上面設好本欄就會自動帶出來

SQLConnection1.GetDriverFunc = ""; // 上面設好本欄就會自動帶出來

SQLConnection1.Parame

DataBase = gaiji-m; // 自己要寫入 ODBC 的名稱

User_Name = “”; // MS Access 的是空白即可

Password = “”;

 

b. DataSet 層(採用 SQLTable)

 

SQLTable1.SQLConnection = SQLConnection1;

SQLTable1.TableName = gaiji; // gaiji-m 裡面的某個表格

 

c. Provider 層

 

DataSetProvider1.DataSet = SQLTable1;

 

d. DataSet 層

 

ClientDataSet1.ProviderName = DataSetProvider1;

 

e. DataSource 層

 

DataSource1.DataSet = ClientDataSet1;

 

f. 資料庫感知元件

 

DBGrid1.DataSource = DataSource1;

 

2. 以 SQLQuery 為例

 

大致同上,差別為:

 

SQLQuery1.SQLConnection = SQLConnection1;

SQLQuery1..SQL = "select * from gaiji"; // SQL;

DataSetProvider1.DataSet = SQLQuery1;

 

3. 以 SQLDataSet 為例

 

SQLDataSet 和 ADO 的 ADODataSet 一樣,也可以做到 Table 及 Query 的功能。

 

a. Table

 

SQLDataSet1.Connection = SQLConnection1;

SQLDataSet1.CommandType = ctTable; // 使用表格模式

SQLDataSet1.CommandText = “gaiji”; // 表格名稱

DataSetProvider1.DataSet = SQLDataSet1;

 

b. Query

 

SQLDataSet1.Connection = SQLConnection1;

SQLDataSet1.CommandType = ctQuery; // 使用 SQL 模式

SQLDataSet1.CommandText = "select * from gaiji”; // 下達 SQL 指令

DataSetProvider1.DataSet = SQLDataSet1;

 

4. DataSource 不可直接與 dbExpress 的 DataSet 層連結

 

不可以直接如下連結:

 

DataSource1.DataSet = SQLTable1; // 也不可直接與 SQLQuery1 連結

 

會出現錯誤訊息:Operation not allowed on a unidirectional dataset.

 

image

 

必須要透過 ClientDataSet 及 DataSetProvider 來轉接。

 

5. 用 TClientDataSet 及 TDataSetProvider 來連結 ADO 與 BDE

試著用 TClientDataSet 及 TDataSetProvider 來連結 ADO 與 BDE,也是可以成功,但同時都不能修改資料,畫面上是可以修改,但無法自動傳回資料庫。

 

不知是不是有地方可以設定,或是它原本就設計成這種執行方式,這些目前我還沒深入去了解。

 


 

 

重要度:
文章分類:

發表新回應

借我放一下廣告