第五章 數(shù)據(jù)集數(shù)據(jù)的后面.....
第一節(jié) 數(shù)據(jù)的狀態(tài)
當(dāng)用Delphi和ADO開發(fā)數(shù)據(jù)庫應(yīng)用程序時,大部分工作用于學(xué)習(xí)數(shù)據(jù)集組件的幫助文檔。。為了創(chuàng)建一個基于ADO的程序,Delphi提供了幾個數(shù)據(jù)集組件:TAdoTable、TAdoQuery和其他的組件。它們用于獲得、呈現(xiàn)和修改數(shù)據(jù)庫表或查詢的數(shù)據(jù)。
在本教程的第五章,我們將通過介紹大多數(shù)感興趣的數(shù)據(jù)集組件的一些屬性、事件和方法來切實(shí)了解怎樣呈現(xiàn)、瀏覽和讀取數(shù)據(jù)。
挑選、設(shè)置、連接和獲得(Pick, set, connect and get)
既然已到了第五章,你應(yīng)該已經(jīng)熟悉創(chuàng)建一個數(shù)據(jù)庫表單所需的步驟。在第四章我們已手工建立了一個簡單的數(shù)據(jù)瀏覽表單。本章將用它繼續(xù)討論。
到現(xiàn)在為止,我們僅使用了一個(ADO)數(shù)據(jù)集組件:TAdoTable。了解TADOQuery和TADODataSet(作為數(shù)據(jù)集組件)對同樣的方法和事件使用同樣的設(shè)置是很重要的。
芝麻開門;芝麻關(guān)門(Open Sesame ; Close Sesame)
Delphi數(shù)據(jù)庫開發(fā)的很重要的特征之一是:Delphi可以在程序設(shè)計時讓我們對數(shù)據(jù)進(jìn)行處理。你可以回憶一下—在前一章,我們使用Active屬性在設(shè)計時就打開了與數(shù)據(jù)的活動連接。
不難理解,在開始處理表的數(shù)據(jù)之前,程序必須首先打開數(shù)據(jù)集。Delphi有兩種方法實(shí)現(xiàn)此功能。第一是如我們已看到的,可以在設(shè)計或運(yùn)行時設(shè)置Active屬性為True;第二是我們可以在運(yùn)行時調(diào)用Open方法。例如,增加如下的代碼到表單的OnCreate事件句柄中,從而得到ADOTable組件的數(shù)據(jù)。
ADOTable1.Open;
注:每個ADO數(shù)據(jù)集都可通過它自己的ConnectionString屬性或一個ADOConnection組件(和它的ConnectionString)訪問數(shù)據(jù)庫的數(shù)據(jù)。如果ADOTable1組件與ADOConnection1組件相連(推薦使用此方式),打開ADOTable將激活相應(yīng)的ADOConnection組件。ADOConnection提供兩個將被執(zhí)行的事件:OnWillConnect和OnConnectComplete。
Open方法設(shè)置Active屬性為True并激活連接。當(dāng)我們處理完連接時,我們可以設(shè)置Active屬性為False或調(diào)用Close方法斷開連接。通常我們都在表單的OnClose事件句柄中放入對Close方法的調(diào)用:
ADOTable1.Close;
在繼續(xù)之前,知道對數(shù)據(jù)集方法和屬性的處理依賴于對數(shù)據(jù)當(dāng)前狀態(tài)的了解是至關(guān)緊要的。簡單地說,數(shù)據(jù)集的State(狀態(tài))屬性決定任何時候數(shù)據(jù)集上的什么行為可以發(fā)生或不發(fā)生。
How are you doing?
如果數(shù)據(jù)集是關(guān)閉的,數(shù)據(jù)的State將顯示為Inactive(非激活)連接。當(dāng)連接是關(guān)閉時,沒有操作、行為或方法可以對數(shù)據(jù)實(shí)施。我們第一次打開數(shù)據(jù)集的連接時,數(shù)據(jù)集處于默認(rèn)的Browse(瀏覽)狀態(tài)。你應(yīng)該始終了解“你的”數(shù)據(jù)所處的狀態(tài)。例如,當(dāng)我們把數(shù)據(jù)集連接到DBGrid時,用戶可以看到潛在的數(shù)據(jù)集(或記錄集),但要想改變某些數(shù)據(jù)就必須把State設(shè)置為Edit。
當(dāng)程序處理數(shù)據(jù)時,了解數(shù)據(jù)集狀態(tài)在不停的改變時非常重要的。例如,當(dāng)在DBGrid中瀏覽數(shù)據(jù)時(Browse狀態(tài)),用戶開始編輯記錄,狀態(tài)將自動改變?yōu)镋dit。當(dāng)然,當(dāng)設(shè)置數(shù)據(jù)可視化控件(DBGrid、DBEdit)的AutoEdit屬性為True時,這是它們默認(rèn)的行為。
但是,我們怎樣得到狀態(tài)呢?ADOTable(其他任何數(shù)據(jù)集組件也一樣沒有)沒有處理狀態(tài)改變時的觸發(fā)器。
好,讓我們看一看:對每個數(shù)據(jù)集組件,我們通常使用一個數(shù)據(jù)源組件來呈現(xiàn)于一個或多個數(shù)據(jù)可視化控件的連接。就是這樣。
每個數(shù)據(jù)源組件都有一個OnStateChange事件,無論潛在的數(shù)據(jù)集狀態(tài)什么時候改變它都見觸發(fā)。把下面的代碼放到OnStateChange事件句柄中,用表單的標(biāo)題顯示ADOTable1數(shù)據(jù)集組件的當(dāng)前狀態(tài):
PRocedure TForm1.DataSource1StateChange(Sender: TObject);
var ds: string;
begin
case ADOTable1.State of
dsInactive: ds:='Closed';
dsBrowse : ds:='Browsing';
dsEdit : ds:='Editing';
dsInsert : ds:='New record inserting';
else
ds:='Other states'
end;
Caption:='ADOTable1 state: ' + ds;
end;
新聞熱點(diǎn)
疑難解答
圖片精選