後一頁 前一頁 回目錄 回首頁 |
在這一章裏我們主要介紹Delphi的數據存取部件的層次結構、 多部件之間的關係、部件的屬性、方法、事件以及各部件的應用。這些部件包括: ● TSession部件 ● 數據集部件(TTable和TQuery) ● TDatasource部件 ● 欄位物件TField ● 欄位編輯器的使用 ● TReport部件和TBatchMove部件 我們對這些部件的屬性、方法和事件進行一般性的描述,讀者在實際使用Delphi開發應用程式時,還可以通過連線輔助敘述獲得有關部件更詳細的資訊。 15.1 Delphi數據存取部件的層次結構 Delphi提供了強大的開發資料庫應用程式的能力,它給用戶提供了大量的數據存取部件。以方便程式設計人員開發資料庫應用程式。這些部件中,有些部件繼承了另一些部件的屬性、方法和事件,也就是說多部件之間存在著繼承和被繼承的關係,各部件的這種關聯便構成了一個層次結構 圖15.1 Delphi數據存取部件的層次結構 TSession是全局性的部件,在應用程式執行時,它自動地建立,在設計階段和執行過程中它是一個不可見的部件。 TDatabase部件是為開發用戶/伺服器資料庫應用程式時,設定登入的資料庫的有關參數的,它在數據存取部件頁上。 TDataset部件是不可見的,TTable和TQuery部件是由它派生而來的,這兩個部件一般被稱為數據集部件,它們在數據存取部件頁上。 TDatasource部件是連接數據集部件和數據瀏覽部件的橋樑,它在數據存取部件頁上。 TFields部件對應於資料庫表中的實際欄位,它既可以在應用程式的執行過程中動態地產生也可以在程式設計階段用欄位編輯器建立。它是不可見的部件,在程式中我們可以通過TField部件來存取資料庫記錄的各個欄位值。 15.2 Tsession部件及其應用 TSession部件一般用得較少,但它對於一些特殊的應用是很有用的,在每一個資料庫應用程式執行時Delphi自動地建立一個TSession部件。程式設計人既不能看見該部件也不能顯示地建立一個TSession 部件,但是我們可以在應用程式中全局性地使用TSession部件的屬性、方法。 15.2.1 TSession部件的重要屬性及作用 TSession部件的許多重要屬性是用於控制資料庫應用程式與資料庫的連接的,在一個應用程式中,可以全局性地設定TSession的有關屬性值,對與之相連接的磁碟上的資料庫進行控制。TSession部件主要有下列屬性: Database屬性:是TSession中可以進行連接的所有資料庫的資料庫名字清單,這些資料庫的名字常常是實際資料庫的別名,包括資料庫的路徑、用戶名、用戶登入密碼等參數。 DatabaseCount屬性:是TSession中可以進行連接的所有資料庫的數量,它是一個整數。 KeepCounnections屬性:是一個布爾型屬性,用它敘述應用程式是否保持與一個非活動資料庫的連接。因為對於一個資料庫,當該資料庫中沒有相應的數據集部件(TTable或TQuery)被打開時,該資料庫將自動地變成非活動的資料庫。缺省情況下,KeePcounnections的值是True,就是說應用程式總是保持著與資料庫的連接, 即使資料庫變成了非活動的資料庫時,也是如此。如果將KeepConnections屬性設定成False,那麼當資料庫由活動狀態變成非活動狀態時,應用程式與該資料庫的連接也隨之中斷。 NetFileDir屬性:敘述BDE網路控制文件的路徑名。 PrivateDir屬性:敘述存取臨時文件的路徑名。 15.2.2 TSession部件的方法: TSession部件中的大部分方法是用於向用戶提供與應用程式相連接的資料庫的資訊,如資料庫的名字及別名,資料庫中的表名以及資料庫引擎BDE的有關參數等,在設計資料庫應用程式時,想要獲取有關資料庫的資訊,呼叫TSession部件的下列方法, 將會大大簡化程式的設計。 GetAliasNames方法:呼叫該方法,我們可以獲得資料庫引擎BDE中定義的資料庫別名。 GetAliasParams方法:該方法主要用於獲取我們在BDE中定義資料庫別名時所敘述的參數值,如BDE所在的目錄路徑以及實際標簽等。 GetDatabaseNames 方法:呼叫該方法可以輔助敘述我們獲得目前應用程式可以進行連接的所有資料庫的名字,資料庫的名字是用戶使用BDE工具定義的實際資料庫的別名。 GetDriverNames方法:資料庫引擎BDE可以與多種資料庫管理系統相連接,如用戶/伺服器資料庫管理系統Oracle、Sybase以及本地資料庫管理系統dBASE,Paradox等,BDE與每一種資料庫管理系統進行連接時,都有相應的驅動程式,而且這些驅動程式都可以選擇地裝設。通過呼叫GetDriverNames方法。我們可以獲得目前BDE裝設的資料庫驅動程式的名字。 GetDriverParams方法:BDE的資料庫驅動程式中包含著多個參數,如支援的民族語言、DBMS的版本號、文件塊大小等,對於伺服器上的DBMS,還有資料庫伺服器的名字等等。 GetTableNames方法:因為每一個資料庫都是由多個資料庫表群群組成的,我們通過敘述資料庫名,然後呼叫GetTableNames方法,便可以獲得該資料庫中全部的資料庫表的名字。 上述這些方法在呼叫時都需要一個字元串清單作為參數, 而且都返回一個字元串清單的值。 TSession部件還有一個叫DropConnections的方法用於控制應用程式與資料庫的連接,當呼叫DropConnections方法時,應用程式與所有的資料庫的連接將會切斷。 15.2.3 TSession部件應用舉例 例15.1:我們建立一個應用程式,通過呼叫TSession有關的方法獲取目前應用程式可以進行連接的資料庫的名字以及獲取其中任意一個資料庫中的全部資料庫表的名字。 通過TSession部件獲取資料庫的有關資訊 窗體中主要使用了兩個列示方塊,其中列示方塊DatabaselistBox用於顯示資料庫的名字,列示方塊TablelistBox用於顯示資料庫中的表名。程式執行完後資料庫的名字顯示在DatabaselistBox列示方塊中,當用戶按一下DatabaselistBox列示方塊中的資料庫名時,該資料庫全部的資料庫表的名字將會顯示在TablelistBox列示方塊中。有關的程式代碼如下: 程式清單15.1 unit unit31; interface uses SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DB, DBTables, Buttons, ComCtrls, Tabnotbk; type TQueryForm = class(TForm) BitBtn1: TBitBtn; DataSource1: TDataSource; Table1: TTable; GroupBox1: TGroupBox; CheckBox1: TCheckBox; CheckBox2: TCheckBox; PageControl1: TPageControl; TabSheet1: TTabSheet; Label1: TLabel; Label2: TLabel; Label3: TLabel; ListBox1: TListBox; ListBox2: TListBox; ListBox3: TListBox; TabSheet2: TTabSheet; Memo1: TMemo; procedure FormCreate(Sender: TObject); procedure ListBox1Click(Sender: TObject); procedure ListBox2Click(Sender: TObject); end;
var QueryForm: TQueryForm;
implementation
{$R *.DFM}
uses RSLTFORM;
procedure TQueryForm.FormCreate(Sender: TObject); begin Screen.Cursor := crHourglass;
{ Populate the alias list }
with ListBox1 do begin Items.Clear; Session.GetAliasNames(Items); end;
{ Make sure there are aliases defined }
Screen.Cursor := crDefault; if ListBox1.Items.Count < 1 then MessageDlg( 'There are no database aliases currently defined. You ' + 'need at least one alias to use this demonstration.', mtError, [mbOK], 0 ); end;
procedure TQueryForm.ListBox1Click(Sender: TObject); var strValue: string; { Holds the alias selected by the user } bIsLocal: Boolean; { Indicates whether or not an alias is local } slParams: TStringList; { Holds the parameters of the selected alias } iCounter: Integer; { An integer counter variable for loops} begin
{ Determine the alias name selected by the user }
with ListBox1 do strValue := Items.Strings[ItemIndex];
{ Get the names of the tables in the alias and put them in the appropriate list box, making sure the user's choices are reflected in the list. } ListBox2.Items.Clear; Session.GetTableNames(strValue, { alias to enumerate } '', { pattern to match } 15.3.4 數據集中的數據維護 數據集中的數據維護主要包括數據記錄的修改,插入和解除。Delphi為數據集部件提供了相應的方法用於其中的數據維護。這些方法如表15.所示。 表15.3 Delphi用於數據維護的方法 ────────────────────────────── 方 法 名 功 能 —————————————————————————————— Edit 將數據集置為編輯狀態 —————————————————————————————— Append 投寄所有被修改的記錄,將記錄指標移到表中的最後 一條記錄,且將數據集置為插入狀態 —————————————————————————————— Insert 投寄所有被修改的記錄將數據集置為插入狀態 —————————————————————————————— Post 將插入的新記錄和修改的記錄寫回磁碟上的資料庫表, 即投寄,當投寄成功時數據集回到瀏覽狀態,若投寄 不成功數據集仍然保持原有狀態 —————————————————————————————— Cancel 取消目前的操作且將數據集置為瀏覽狀態 —————————————————————————————— Delete 解除目前記錄指標所在的記錄且將數據集置為瀏覽狀態 —————————————————————————————— AppendRecord 在表的最後插入一條新記錄,記錄的各個欄位值作為 AppendRecord的參數傳遞給新記錄 —————————————————————————————— InsertRecord 在目前指標所在記錄的後面插入一條新記錄, 記錄的 各個欄位值作為InsertRecord的參數傳遞給新記錄。 —————————————————————————————— SetRecords 修改目前記錄,欄位名和相應的欄位值作為SetRecords 的參數 ────────────────────────────── Edt方法:如果應用程式想對數據集中的數據記錄進行修改,我們必須要將數據集設定成編輯狀態。呼叫數據集部件的Edit方法便可以將數據集置成編輯狀態,當數據集已經處在編輯狀態時,呼叫Edit方法不會產生作用。當數據集處於編輯狀態時,移動記錄指標或呼叫post方法都可以將目前記錄的修改寫回到磁碟資料庫表中。在程式中, Edit方法和post方法常常配合在一起使用,用於修改表中的記錄。如: Table1.Edit; Tabel1.FieldByName('CustNo').Asstring := '1234'; Table1.st; 在上述這一段程式代碼中,第一行程式是將Table1置成編輯狀態,第二行程式是對目前記錄指標所在的記錄的CustNo欄位的值修改成'1234',第二行程式是呼叫post方法將對目前記錄的修改寫回資料庫表。 Append方法和Insert 方法:這兩個方法都是將數據集部件置成插入狀態,以在表中插入新記錄,Insert方法是在目前指標位置的記錄後面插入一打新記錄,Append方法是在表的尾部插入一打新記錄,不過這要注意,無論用戶是呼叫Insert方法還是Append方法插入新記錄,增加記錄到一個具有索引的表中時,都是按照索引順序寫入其位置,也就是說對於索引表格Insert方法和Append方法的作用是一樣的,Append僅適用於沒有索引的表。Insert方法和Append方法實際上是將數據集置成插入狀態,並且插入一條空白記錄,要真正插入一條新記錄,我們必須在呼叫Insert或Append方法之後,還要給新記錄的各個欄位賦值,最後呼叫post方法,將插入的記錄寫回資料庫表。呼叫這兩種方法插入新記錄的一般步驟如下: With tabe1 DO Begin Insert; {呼叫Insert方法,插入一條空記錄} <為記錄的各欄位賦值> Post; End; Post方法:數據集中的記錄被修改或插入新記錄時呼叫post方法將數據集的修改寫回到資料庫表。根據數據集所處的狀態不同,post方法所產生的作用和效果是不一樣的: ● 當數據集處於編輯狀態時,呼叫post方法,將目前記錄的修改寫回資料庫表 ● 當數據集處於插入狀態時,呼叫post方法,將插入的新記錄寫回資料庫表 ● 當數據集處於SetKey狀態時,呼叫post方法,將數據集置成瀏覽狀態(Browse狀態)
post方法的呼叫既可以顯式地呼叫,也可以隱含地呼叫,當數據集處於編輯狀態或插入狀態時,當移動記錄指標時,Delphi會隱含地呼叫post方法,將將目前記錄的修改寫回資料庫表,在程式呼叫Insert方法或Append方法時,也會隱含地呼叫Post方法,將先前的數據集的修改寫回資料庫表。 Delete方法:Delete方法用於解除表中的記錄,呼叫Delete方法時,將會解除表中目前的記錄,並且自動地將記錄指標移到被刪記錄的下一條記錄,同時將數據集置成Browse狀態。 Cancel方法:Cancel方法用於取消目前的操作,當程式還沒有呼叫Post方法,將對記錄的修改寫回資料庫表時,呼叫Cancel方法,可以將記錄恢復到沒有修改之前的狀態。並且在呼叫Cancel方法時,它總是將數據集置成Browse狀態。 AppendRecord方法和InsertRecord方法:這兩個方法分別與Append方法和Insert方法相似。它們都是用於在表中插入一條新記錄,但AppendRecord方法和InsertRecord方法比Append和Insert方法更簡單更方便一些,它們直接在表中插入一條新記錄,新記錄的各個欄位值作為AppendRecord或InsertRecord方法的參數傳遞給新記錄並且不需顯式地呼叫post方法,將插入的新記錄寫回資料庫表。在給插入的新記錄賦欄位值時,將由多個欄位值群群組成的數群群組作為AppendRecord或InsertRecord的參數,在欄位值數群群組中可以為每一個欄位提供一個值,或從左邊一列開始依次為任意多個欄位賦值。也就是說,用戶可以從資料庫表的最左一列起,把許多列的值同時傳遞給InsertRecord,直到所有的欄位被賦值,用戶也可以省略欄位序列後面的的一些欄位值,InsertRecord會用空值來填充這些欄位:用戶也可以對那些明確希望用空填充的欄位傳遞保留字NIl。 例如:如果表Country有Name,Captial,Continent,Area和Population欄位, 並且數據集部件Table1與它相連,下面的代碼便可以在Country表中目前記錄的後面插入一條新記錄。
Table1.InsertRecord (["中國","北京","五洲"]);
在上述代碼中沒有為Area和population欄位賦值,InsertRecord會用空值來填這兩個欄位。 SetRecords方法:呼叫該方法可以修改表中目前記錄的多個欄位的值,呼叫該方法之前必須將數據集部件置成編輯狀態,呼叫該方法之後,還要呼叫post方法,才能真正將目前記錄的修改寫回資料庫表。呼叫SetRecord方法時,被修改的欄位值必須要與表中實際存在的欄位名對應,並且數據型式要相匹配。例如,下面的代碼是修改上面剛剛插入的那條記錄。
Table1.Edit; Tabel1.SetRecord(, , ,9600000,1200000000); Tabel1.post;
這一段代碼是修改上面剛剛插入的那條記錄的Area 和Population 欄位的值,而對Name,Continent和Captial欄位沒有修改。 在數據集部件中,還有一個重要方法Abort方法,該方法是用於取消其他方法的呼叫的,如在插入記錄、修改記錄和解除記錄之前,往往需要用戶確認是否真的要執行這種操作,此時呼叫Abort方法便可取消各種方法的呼叫,下面的代碼是在用戶解除一條記之前,讓用戶確認是否真的要執行解除操作。 Tabel1.BeforeDelete(DataSet:TDataSet); If MessageDlg('真的要解除記錄嗎?', mtConfirmation,mbyesNoCanel,0 <> mryes then Abort; {取消解除操作} 關於書簽(BookMark)操作; 書簽操作主要用於在表中快速地定位記錄指標,在應用程式中常常要存檔記錄指標所在的位置,在進行其他處理之後,希望能快速地返回到先前指標所在的位置,此時,使用書簽將顯得特別有用。有關書簽操作,Delphi提供了三個方法,它們是: ● GetBookMark ● GotoBookMark ● FreeBokMark
這三個方法一般都是在一起使用,GetBookMark方法返回一個TBookMark型式的變數,該變數包含著指向目前記錄的指標,GotoMark方法用於快速地將記錄指標定位到具有書簽的記錄處。FreeBookmark方法是與GetBookMark方法相反的操作,它釋放書簽標誌。下面的程式代碼闡述了書簽操作的一般方法:
BookMark : TBookMark; <Do something> BookMark := Table1.GetBookMark; {對目前記錄作書簽標誌} Table1.DisalbeControls; {切斷Table1與數據察覺部件的聯繫} Table.First While Not EOF Do {對表中全部記錄進行其他處理} begin <Do something> Tabel1.Next; end; Tabel1.GotoBookMark(BookMark) Table1.enableControls; {重新定位記錄指標回到原來的位置} Tabel1.FreeBookMark(BookMark); {解除書簽BookMark標誌} 15.3.5 數據集部件與數據瀏覽部件的連接 數據集部件TTabel和TQuery具有三個方法,DisableControls 方法、EnableControls方法、Refresh方法用於控制數據集部件和與其相連的數據瀏覽部件之間的連接,以及控制數據瀏覽部件的顯示。在用戶修改和更新以及遍曆資料庫表中的記錄時,呼叫DisableControls方法具有重要意義,呼叫DisbaleControls方法以切斷TTable或TQuery部件與數據瀏覽部件的連接,使數據瀏覽部件暫時失效,否則,在對TTable或TQuery部件的每次修改之後,窗體中所有與它們相連的數據瀏覽部件都要更新其顯示內容,這親顯然會減慢處理速度。當遍曆表中的記錄時記錄指標每移動一下,窗體中的數據瀏覽部件也隨之更新一下其中的顯示內容,在螢幕上產生閃爍。 EnableControls方法的作用與DisbaleControls方法的作用是相反的,呼叫EnableControls方法,使TTable或TQuery部件恢復與數據瀏覽部件的連接,使暫時失效的數據瀏覽部件恢復到正常顯示表中記錄資訊的狀態。 Refresh方法用於刷新數據瀏覽部件中的顯示。在呼叫Refresh方法時,必須要確保TTable或TQuery部件是打開的。當數據集中的記錄被修改之後,呼叫Refresh方法,數據瀏覽部件中顯示的資訊也隨之改變。
|
後一頁 前一頁 回目錄 回首頁 |