View
57
Download
3
Category
Preview:
DESCRIPTION
第二十一章 ActiveX Data Objects. - PowerPoint PPT Presentation
Citation preview
第二十一章 ActiveX Data Objects 前面第 17 章 , 筆者已講述 Borland Database Engine
( 簡稱 BDE) 模式的資料庫操作 , 本章的 ActiveX Data Objects( 以下簡稱 ADO) 則是微軟所大力推廣的資料庫存取模式。而 Borland 公司的 Delphi 及 C++Builder 亦支援此模式 , 故可以使用 ADO 封裝的元件撰寫資料庫程式。 ADO 的資料來源元件 , 如下圖所示 , 其中 ADOTable 及 ADOQuery 的功能與 BDE 的 Table 及 Query 的用法相近。
ADO 與資料聯繫物件 資料庫編輯的方式 主副明細 報表的製作
ADO 與 BDE 的關係 前面第 16 章 , 我們已說明 BCB 的資料存取模式共有 4 種 , 分
別是 BDE 、 ADO 、 dbExpress 及 InterBase, 其存取模式如下圖所示 , 其中 BDE 、 ADO 、 dbExpress 及 InterBase 稱為資料源元件。
於 BDE 模式中 , 我們已介紹使用 Table 、 Query 及 QuickRep 等元件展示、查詢、新增、修改、刪除及列印資料庫的內容。本單元則要使用 ADO 模式 , 重複完成以上資料庫的基本操作工作。其次 , 由上圖中 , 讀者將不難發現 , 要使用 ADO 模式完成以上資料庫基本操作 , 只要將 BDE 標籤的元件以 ADO 標籤的元件代替即可 , 請看以下各節介紹。
2 1 -1 ADO 與資料連繫物件 前面第 17-1 節 , 我們已使用 BDE 模式
展示資料庫的內容 , 若使用 ADO 模式 , 則只要將 BDE 模式的 Table 元件以 ADO 模式的 ADOTable 元件取代即可 , 請看以下範例說明。
ADOTableADOTable 與 Table 都是一種逐一瀏覽的方式編輯資料庫 , 此種資料編輯方式 , 本書歸納以下幾個單元 , 分別是資料項的表示、記錄指標的移動、記錄的新增、記錄的刪除、記錄的更正、記錄的搜尋及記錄的排序。
資料項ADOTable 元件的資料項表示法如下,其中 FieldByName 與 Fields[ 欄位索引 ] 應加上型別轉換函式。ADOTable1->FieldValues[" 欄位名稱 "] ;ADOTable1->FieldByName(" 欄位名稱 ")-> 型別轉換函
數 ;ADOTable1->Fields->Fields[ 欄位索引 ]-> 型別轉換函數 ;
在以上敘述中,型別轉換函式可為 AsVariant 、 AsString 、 AsInteger 、 AsFloat 、 AsCurrency 、AsDateTime 及 AsBoolean 等。如果要將資料項放入 Text1 物件,則應加上 AsString ,將型別轉換為 String 型別。例如,以下敘述可將欄位順序為 0 的 Name 欄位放入 Edit1 物件。Edit1->Text = ADOTable1->FieldValues["Name"] ;Edit1->Text = ADOTable1->FieldByName("Name")->AsS
tring ;Edit1->Text = ADOTable1->Fields->Fields[0]->AsString ;
若已將欄位物件加入欄位編輯器,則亦可使用欄位物件名稱代表某一資料項。例如,以下敘述可存取Name 資料項的內容。ADOTable1Name->Value ; // 要注意大小寫ADOTable1Name->AsString ;
記錄指標當我們使用 ADOTable 物件開啟資料表時 , 不管記錄的多寡 , 均存在一個稱為記錄指標的東西 , 指向資料表的第一筆記錄 , 我們稱此記錄為作用中的記錄 , 此時若進行資料項的編輯 , 則其操作對象即為此記錄指標所指的記錄 , 如下圖所示。
欄位編輯視窗 於表單的資料源元件圖項按二下 , 即可出現欄位編輯視窗 , 使用者可於欄位編輯視窗新增一些欄位物件。下圖右的 ADOTable1name 、 ADOTable1chi 及 ADOTable1eng 即為新增的欄位物件 , 此時即可於程式中使用欄位物件存取資料項 , 以下敘述可將 ADOTable1name 的內容指定由 Edit1顯示。Edit1->Text=ADOTable1name->AsString ;
記錄的新增 於資料表中欲新增一筆記錄 , 其方法為
使用 Insert 及 Post 方法 , 其中 Insert 是告訴資料庫即將新增記錄、 Post 是將位於記憶體緩衝區的資料回存至資料庫。其中資料項的表示 , 本例示範 FieldByName (" 欄位名稱 ") 的使用方式 , 讀者可自行使用上一單元所介紹的其它資料項表示法。例如 , 以下敘述可分別插入一個字串與一個數值型別的記錄。
// 以下敘述使用了型別轉換函數 AsStr ing 及 AsIntegerADOTable1->Insert() ;// 欄位 1 的型別為 StringADOTable1->FieldByName(" 欄位名稱 1")->AsString =Edit1->Text ;// 欄位 2 的型別為 IntegerADOTable1->FieldByName(" 欄位名稱 2")->AsInteger =StrToInt(Edit2->Text) ;ADOTable1->Post() ;
以下程式片段 , 可於 Test1.mdb 的 grade 資料表新增一筆記錄。
// 以下敘述使用了型別轉換函數 AsStr ing 及 AsIntegerADOTable1->Insert() ;ADOTable1->FieldByName("Name")->AsString = "謝承佑 " ;ADOTable1->FieldByName("Chi")->AsInteger = 92 ;ADOTable1->FieldByName("Eng")->AsInteger = 88 ;ADOTable1->Post() ;
記錄的更正是使用 Edit 及 Post 的方法 , 其語法如下 :ADOTable1->Edit() ;ADOTable1->FieldByName(" 欄位名稱 1")->AsString =Edit1->Text ;ADOTable1->FieldByName(" 欄位名稱 2")->AsInteger =StrToInt(Edit2->Text) ;/ / 注意型別轉換ADOTable1->Post() ;
但是如果我們在表單中使用了資料感知元件 ( 例如, DBEdi t) ,則您只要更改了資料感知元件中的內容,使用以下敘述即可將更改後的內容寫入資料庫中。
ADOTable1->Post() ; 以下程式片段可更正 grade 資料表的記錄指標所在記錄。
ADOTable1->Edit() ;ADOTable1->FieldByName("Name")->AsString = "孫大明 " ;ADOTable1->FieldByName("Chi")->AsInteger = 22 ;ADOTable1->FieldByName("Eng")->AsInteger = 33 ;ADOTable1->Post() ;
記錄的更正
範例 21-2e示範記錄的更正 ( 資料表同上範例 ) 。1. 下圖是程式執行結果的初始畫面 , 筆者已將記錄指標
移至 " 朱安琪 " 這筆記錄 , 右邊的三個 DBEdit 元件因是連繫元件的關係 , 亦同時顯示 " 朱安琪 " 的資料。
2. 下圖是按一下 " 更正記錄指標的內容 ", 此按鈕執行以下程式片段 , 所以執行結果 , 如下圖所示。
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -/ / 更正一筆記錄void _ _fastcall TForm1::btnEdit1Click(TObject *Sender){
ADOTable1->Edit() ;ADOTable1->FieldByName("Name")->AsString = "謝承佑 " ;ADOTable1->FieldByName("Chi")->AsInteger = 92 ;ADOTable1->FieldByName("Eng")->AsInteger = 88 ;ADOTable1->Post() ;
}/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3. 下圖左是按一下 " 更正以上記錄 " 的結果 , 此按鈕執行以下程式片段 , 其功能是將連繫物件 DBText 的內容回存資料庫。/ / 將連繫元件的結果回存資料庫void _ _fastcall TForm1::btnEdit2Click(TObj
ect *Sender){
ADOTable1->Post() ;}
4. 下圖右是按一下 " 將國文分數加百分之十 " 的結果 , 此按鈕的程式片段如下 :
void _ _fastcall TForm1::btnEdit3Click(TObject *Sender){
ADOTable1->First() ;while (! ADOTable1->Eof) {
ADOTable1->Edit() ;ADOTable1->FieldByName("Chi")->AsInteger =ADOTable1->FieldByName("Chi")->AsInteger * 1.1 ;ADOTable1->Post() ;ADOTable1->Next() ;
}}
記錄的搜尋ADO 模式中記錄的搜尋 , 其方法有 Locate 及 Filter, 分別說明如下 :
LocateLocate 的語法如下 :
virtual bool _ _fastcall Locate(const AnsiString KeyFields,const System::Variant &KeyValues,TLocateOptions Options);
以上語法說明如下 : KeyFields: 欲搜尋的欄位名稱。 KeyValues: 欲搜尋的欄位值。 Options: 搜尋方式。其型別是 TlocateOptions 的集合型別 , 如下所示 , 其中 loCa
seInsensitive 是表示搜尋時大小寫不分 , loPartialKey 是部份字元符合即可 , 例如輸入 " 學樂 ", 若有 " 學樂出版社 " 或 " 學樂出版有限公司 ", 均符合搜尋條件。
enum TLocateOption {loCaseInsensitive, loPartialKey}; 當搜尋成功時 , Locate 函數傳回 true, 並將記錄指標移到合乎條件的第一
筆記錄 ; 若傳回false, 則記錄指標並不移動。
Filter 上一單元的 Locate 較適合做字串的搜
尋 , 若是數值的搜尋 , 例如 "chi>60" 或 "chi<80" 時 , 則無法使用 Locate, 像這種搜尋某一範圍的動作 , 則較適合使用 Filter 。 Filter 的語法如下 :
ADOTable1->Filter= " 數值欄位名稱關係運算子條件值 " ;ADOTable1->Filtered=true ;
排序 ADOTable 元件使用 Sort 屬性進行排
序 , Sort 屬性語法如下 , 預設值是升冪ASC, 值得注意的是 , ASC 與 DESC 一律都必須大寫才行。ADOTable1->Sort = " 欄位名稱 <ASC/DESC>";
ADOQuery 於 BDE 模式中 , 是使用 Query 元件執行 SQL 字串 , 但是 ADO 模式中則使用ADOQuery 。關於 SQL 的用法 , 本書已分別於 17-4 節及 19 章介紹 , 本單元的 ADOQuery 的用法則與 Query 相近 , 以下範例示範如何使用 ADOQuery 展示 test1.mdb 的 grade 資料表。
ADOConnection 前面的 ADOTable 及 ADOQuery 均較適合一
次開啟一個資料表 , 但是有些時候您必須同時開啟兩個資料表 , 此時若還是使用 ADOTable 或 ADOQuery 開啟資料庫 , 則因要設兩次 ConnectionString, 所以您的資料庫將被兩個程式所連接而影響執行速度 , 所以若要同時開啟兩個資料表 , 則應使用 ADOConnection 元件。
以下範例則示範如何使用 ADOConnection 元件連結兩個資料表 , 以進行主副明細查詢。
21 - 4 報表的製作 ADO 報表的製作與 BDE 模式的報表製
作完全相同 , 只要將資料源物件以 ADO 標籤的元件替換即可。以下僅以列印 test1.mdb 的 grade 資料表示範 ADO 報表製作 , 其餘請自行參考第 18 章。
Recommended