本章內容為增加、刪除、修改數據庫表中的記錄。
開發數據庫應用程序的主要目的,就是提供一種修改數據的方法。在第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的,當用戶一開始編輯控件中的值時,數據集狀態就會從“浏覽”變為“編輯”。當我們試圖把一個已處於編輯狀態的數據集置為編輯狀態時,程序不會產生錯誤。
代碼如下:
[delphi]
ADOTable1.Edit; //將數據集置於“編輯”狀態
ADOTable1AuthorName.Value := 'Delphi Guide'; //將字符串‘Delphi Guide’賦值給AuthorName字段
ADOTable1.Post; //將修改後的數據發布到數據庫;
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也會觸發一系列的相關事件。
下面為插入並發布新記錄的相關示例代碼:
[delphi]
with ADOTable1 do begin
Insert;
FieldByName('AuthorName').Value := 'ZarkoGajic';
FieldByName('Email').Value := '[email protected]';
FieldByName('Web').Value:= 'http://sf.hr';
Post;
end;
with ADOTable1 do begin
Insert;
FieldByName('AuthorName').Value := 'ZarkoGajic';
FieldByName('Email').Value := '[email protected]';
FieldByName('Web').Value:= 'http://sf.hr';
Post;
end;
注: ADOTable組件具有InsertRecord方法,可用於在數據集創建一個新的空記錄,填寫字段的值,並將值發布到數據庫中——所有這些操作只需一行代碼。示例如下:
[delphi]
ADOTable1.InsertRecord('ZarkoGajic','[email protected]','http://sf.hr');
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事件。