Delphi數據庫編程新手指南(06)

數據修改

  本章內容爲增加、刪除、修改數據庫表中的記錄。

  開發數據庫應用程序的主要目的,就是提供一種修改數據的方法。在第5章,課程展示瞭如何連接到一個Access數據庫,如何顯示數據庫表中的數據,以及如何遍歷瀏覽表中的記錄。

在本章中,將會學習如何增加、刪除和修改數據——通過db-aware/enabled組件對象中的某些屬性、事件和方法。

首先,我們需要創建一個類似於前面章節中所創建的數據窗體。通過使用標準的組件集(DataSource、ADOTable和ADOConnection)來連接到Access數據庫。這一次,我們將探索Authors表。回想一下,Authors表具有三個字段(列):authorName,Email和Web,且都爲文本字段。在第一章中,我們已增加了一條“虛擬”記錄。


創建一個新的Delphi項目,在默認窗體上放置所有的數據訪問組件以及一個DBGrid和DBNavigator。使用Object Inspector關聯這些組件,並將ADOTable1的TableName指向Authors表——這些實現連接的步驟你應該已經很熟悉了。使用ADOTable的Active屬性在設計時激活連接;或在窗體的OnCreate/ OnClose這對事件句柄中處理,在運行時打開/關閉數據集。

用Delphi開發數據庫應用程序的巨大優勢之一便是TField對象的存在。如前幾章所述,數據庫字段可以是持久性的或是動態創建的。我們建議設置持久性(已知)的數據集字段列表——通過使用Object Inspector將這三個字段添加到列表中。並使用拖放(詳見第5章),將數據感知控件DBEdits連接到數據庫表中的特定字段。


Posting

當各組件關聯後,同數據感知組如DBGrid一起使用的DBNavigator,能對錶中的記錄進行半自動化的修改、刪除和增加操作。例如,假設你正在使用DBGrid瀏覽記錄集,並開始在某些單元格重新鍵入文本(編輯基礎字段的值),這時,該數據還沒有被修改,直到POST方法被調用。(數據集的)Post方法在Delphi數據庫應用程序中起着關鍵作用。

當數據集處於編輯(Edit)狀態時,調用Post會修改當前的記錄。點擊DBNavigator的Post按鈕(面板上的“√”按鈕)時便會調用Post方法。你需要知道,當你移動到下一條記錄時,Post會被隱式的調用——例如在DBGrid中編輯記錄時,按向下(▶)鍵。

應用程序(顯式或隱式)調用Post方法時產生的事件,通過Delphi可以抓取到;例如,(數據集的)BeforePost事件會在記錄“修改”之前觸發。在數據變化發佈到數據庫之前,應用程序可以用OnBeforePost來進行有效性檢查。這種基於記錄的驗證,是非常有必要的——尤其對於那些需要判斷輸入值是否有效的字段。同時,可以用字段特有的OnValidate事件來驗證有效性。調用字段編輯器,並選擇相應的字段,在ObjectInspector中即可找到OnValidate。

Editing a record

  爲了能夠對數據集返回的數據進行編輯,數據集必須處於編輯狀態。數據感知控件(DBGrid、DBEdit)的AutoEdit屬性默認是爲True的,當用戶一開始編輯控件中的值時,數據集狀態就會從“瀏覽”變爲“編輯”。當我們試圖把一個已處於編輯狀態的數據集置爲編輯狀態時,程序不會產生錯誤。

  代碼如下:

ADOTable1.Edit;	//將數據集置於“編輯”狀態
ADOTable1AuthorName.Value := 'Delphi Guide';	//將字符串‘Delphi Guide’賦值給AuthorName字段
ADOTable1.Post;	//將修改後的數據發佈到數據庫;

  一起看看上次調用所觸發的一些事件:

ADOTable1BeforeEdit
  DataSource1StateChange
  DataSource1DataChange
  ADOTable1AfterEdit
  ADOTable1AuthorNameValidate
  ADOTable1AuthorNameChange
  DataSource1DataChange
  DataSource1StateChange
  ADOTable1BeforePost
  DataSource1StateChange
  ADOTable1AfterPost

Adding a new record

  向表中添加一條新記錄最簡單的方法是單擊DBNavigators的“插入(+)”按鈕。調用Insert方法,會在表中添加並打開一個新的記錄——DBGrid首列帶星號標誌的空行。其三個DBEdit組件都是空的,以便用戶輸入新的記錄值。

同樣,調用Insert也會觸發一系列的相關事件。

下面爲插入併發布新記錄的相關示例代碼:

with ADOTable1 do begin
 Insert;
 FieldByName('AuthorName').Value := 'ZarkoGajic';
 FieldByName('Email').Value := '[email protected]';
 FieldByName('Web').Value:= 'http://sf.hr';
 Post;
end;

注: ADOTable組件具有InsertRecord方法,可用於在數據集創建一個新的空記錄,填寫字段的值,並將值發佈到數據庫中——所有這些操作只需一行代碼。示例如下:

ADOTable1.InsertRecord('ZarkoGajic','[email protected]','http://sf.hr');

"Undo" changes

  在“編輯”(修改數據)或插入狀態(添加一條新紀錄)時,應用程序可以調用Cancel方法。 或點擊DBNavigator上的“×”按鈕。如果在編輯記錄時調用,已連接的數據感知控件復原爲原來的值;插入時調用空行會被“刪除”。取消操作會使數據集返回到瀏覽狀態。

Deleting a record

  點擊DBNavigator上的“-”按鈕,將調用數據集的Delete方法,調用Delete方法後不需再調用Post。我們可以用BeforeDelete事件來試圖防止用戶從表中刪除記錄;當然,DBNavigator的ConfirmDelete屬性也能防止用戶意外刪除記錄。如果沒有一個已連接到數據集的DBNavigator——也可在DBGrid上按Ctrl+ Delete來調用Delete方法。如果在執行Delete方法時發生錯誤,將會觸發OnDeleteError事件。

   下一章,我們將使用多種方法來修改數據集中的數據。我們只需知道,Delphi已經爲我們提供了足夠的屬性、方法和事件,來確保我們有辦法控制如何去處理數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章