14.6 修改數據庫中的記錄
我們掌握了字段對象的概念和如何查找數據庫中的記錄之後,下面我便可以很方便地修改數據庫中現存的記錄了,一般來說,在程序中修改數據庫中的記錄包括下面這些步驟:
1、在數據庫中找到要修改的記錄,並將記錄指針移至該記錄。
2、調用Edit方法將與數據庫表相連的TTable部件設置成編輯狀態。
3、修改一個或多個字段。
4、調用post方法將修改後的記錄寫入數據庫。
以上這幾個步驟只是概述性的,具體實現時還有很多細節需要留心,我們通過一個例子來演示上面的全過程,以便讓讀者進一步地了解和掌握修改記錄的方法。
例14.6 我們為四個按鈕分別編寫了事件處理過程,用來遍歷數據庫中的記錄並對每個客戶記錄的Company字段進行修改,在程序對記錄進行更新操作時窗口中的控件都是無效的,在這個例子中我們還編寫了一個簡單的異常代碼塊用來確保在更新過程中出現異常時使控件恢復正常操作。
修改數據庫記錄
14.6.1 Edit方法Post方法
為了能讓用戶通過程序修改數據庫表中的記錄,TTable部件必須要處在編輯狀態下。在大多數情況下,數據庫表都是以浏覽(只讀方式)方式打開的,也就是說它的每一個字段可以被讀取介不能被編輯修改。調用Edit 方法能夠將 TTable 部件置成編輯狀態, 當TTable部件處於編輯狀態後,我們才可以通過程序修改當前記錄指針所指向的記錄,但這樣修改後的記錄不會立即被寫入到磁盤上的實際數據庫表中。要想保存對記錄的修改,必須要調用Post方法,Post方法才真正將我們對記錄的修改寫入實際的數據庫表中。
一般來說,用來掃描整個數據庫表並修改每個記錄的某一個字段的程序如下所示:
with Table Do
begin
DisableControls;{在修改記錄的過程中,使其它部件無效}
First; {將記錄指針指向第一條記錄}
while not EOF do
begin
<讀取記錄的一個字段值到一個變量中>
<做適當的修改>
Edit; {將TTable部件置成編輯狀態}
<將修改後的字段值寫回到其對應的字段>
post; {將修改後的記錄寫回數據庫}
next; {修改下一條記錄}
end;
enablecontrols; {恢復其它部件的功能}
end;
程序都是對TTable部件進行操作,因此使用With語句來防止錯誤的擴散是很有意義的。在這裡要注意Disablecontrols方法和EnableControls方法的使用。DisableControls方法是在程序修改TTable部件中的記錄時,切斷TTable部件與數據訪問部件TDatasource 部件的聯系。否則,在對TTable中的每一修改之後,TDataSource 部件都會更新窗體中所有數據浏覽部件的顯示內容,這樣會急劇減慢處理過程而且浪費時間。EnableControls方法是與DisableControle方法執行相反的操作,它是用來恢復TTable部件與TDatasource部件的聯系並促使所有的數據浏覽部件更新顯示。
調用First方法是將記錄指針移到數據庫表中的第一條記錄,確保程序從表中的第一條記錄開始進行修改。調用Next方法是將記錄指針從當前的記錄移到下一條記錄,這樣保證了從表中的第一條記錄開始逐條記錄進行修改,直到修改完最後一條記錄。如果不調用Next方法,程序將會陷入無窮的死循環。
14.6.2 實現異常保護的TRY...FINALLY語句
上面的程序存在著潛在的危險,在實際應用過程中,可能因為某些原因使得對數據庫表的更新不能進行下去。如當程序試圖執行Post方法將修改後的記錄寫回磁盤時,而又因為某種原因磁盤沒有准備好,這時便出現了異常。當出現異常時,應用程序會暫停下來並且會彈出一對話框顯示有關的錯誤信息,在用戶單擊錯誤信息對話框之後,程序將繼續執行到某一個地方去,而這個地方常常不是用戶所能預料到的。在我們的程序中, 在執行Post方法之前,窗體中所有的部件與TTable部件都已失去聯系。因此,這種異常將導致窗體中顯示的數據和數據庫無關。
Object Pascal中的Try...Finally語句為我們解決上述異常問題提供了一個解決方法。在Delphi中仍然采用了這一語句用來處理異常問題。實際上,Try...Finally 語句是把兩組語句組合在一起。語句的Try部分包含了可能產生異常的程序代碼,Finally部分包含了即使發生了異常也必須執行的一條或多條語句。在本例中, Finally 部分只包含了EnableControls方法調用這一條語句,我們將前面的代碼改寫並組合進Try...Finally 語句:
with Table Do
begin
DisableControls;{在修改記錄的過程中,使其它部件無效}
Try;
First; {將記錄指針指向第一條記錄}
while not EOF do
begin
<讀取記錄的一個字段值到一個變量中>
<做適當的修改>
Edit; {將TTable部件置成編輯狀態}
<將修改後的字段值寫回到其對應的字段>
post; {將修改後的記錄寫回數據庫}
next; {修改下一條記錄}
end;
enablecontrols;
Finally;{出現異常時,執行下面的程序}
enablecontrols; {恢復其它部件的功能}
end; {結束Try...Finally語句}
end;