在CSDEMO應用程序中另一個使用存儲過程的TStoredProc部件是DeleteEmployeeProc。它完成的任務是刪除Employee表中的記錄,並修改所有相關的表, 以維護數據的一致性。其屬性如下:
表18.20 DeleteEmployeeProc部件主要屬性的取值
━━━━━━━━━━━━━━━━━━━━━━━━━━
屬性名 屬 性 值
──────────────────────────
DataBaseName EmployeeDemoDB
ParamBindMode PbByName
Params EMP_NUM(輸入參數,整型)
StoredProcName DELETE_EMPLOYEE
━━━━━━━━━━━━━━━━━━━━━━━━━━
存儲過程DELETE_EMPLOYEE的程序如下:
PROCEDURE DELETE_EMPLOYEE
DECLARE VARIABLE any_sales INTEGER;
BEGIN
any_sales = 0;
SELECT count(po_number)
FROM sales
WHERE sales_rep = :emp_num
INTO :any_sales;
IF (any_sales > 0) THEN
BEGIN
EXCEPTION reassign_sales;
SUSPEND;
END
UPDATE department
SET mngr_no = NULL
WHERE mngr_no = :emp_num;
UPDATE project
SET team_leader = NULL
WHERE team_leader = :emp_num;
DELETE FROM employee_project
WHERE emp_no = :emp_num;
DELETE FROM salary_history
WHERE emp_no = :emp_num;
DELETE FROM employee
WHERE emp_no = :emp_num;
SUSPEND;
END
Parameters:
EMP_NUM INPUT INTEGER
從上述存儲過程的例子中,我們看到存儲過程在維護服務器上的數據一致性方面有很強的能力,它節省了系統開銷,提高了客戶端的性能。
18.4.2.5 事務控制編程
在客戶/服務器應用程序中,事務控制是一項很重要的技術。它對於提高系統的可靠性,維護數據一致性有著重要的意義。
Delphi中提供了事務的隱式和顯式兩種控制方法。其中顯式控制的性能較高,下面介紹Delphi事務顯式控制的編程方法。
Delphi擔當事務控制任務的部件是TDatabase 。TDatabase 用於事務控制的屬性是TransIsolation,方法有StartTranstion、Commit和Rollback。關於這些屬性和方法作用和使用方法請參閱客戶/服務器事務管理。
在CSDEMO中TDatabase 部件為EMployeeDatabase,其TransIsolation屬性值為tiReadCommitted,意為如果存在多個同時事務訪問數據庫,則其中任一事務只能讀其它事務提交的了數據。
CSDEMO中演示事務控制的窗體是TFrmTransDemo。
DBGrid1中顯示EmployeeTable中的內容。當窗口顯示時,EmployeeDatabase開始一次事務控制並激活EmployeeTable:
procedure TFrmTransDemo.FormShow(Sender: TObject);
begin
DmEmployee.EmployeeDatabase.StartTransaction;
DmEmployee.EmployeeTable.Open;
end;
當窗口被關閉或隱藏時,EmployeeDatabase提交事務:
procedure TFrmTransDemo.FormHide(Sender: TObject);
begin
DmEmployee.EmployeeDatabase.Commit;
end;
窗口中有兩個按鈕BtnCommitEdits和BtnUndoEdits。按下BtnCommitEdits按鈕將提交當前事務,並開始新的事務控制並刷新數據。
procedure TFrmTransDemo.BtnCommitEditsClick(Sender: TObject);
begin
if DmEmployee.EmployeeDatabase.InTransaction and
(MessageDlg('Are you sure you want to commit your changes?',
mtConfirmation, [mbYes, mbNo], 0) = mrYes) then
begin
DmEmployee.EmployeeDatabase.Commit;
DmEmployee.EmployeeDatabase.StartTransaction;
DmEmployee.EmployeeTable.Refresh;
end else
MessageDlg('Can''t Commit Changes: No Transaction Active', mtError, [mbOk], 0);
end;
按下BtnUndoEdits按鈕將返轉當前事物,恢復原來的數據,開始新的事務控制,並刷新數據的顯示。
procedure TFrmTransDemo.BtnUndoEditsClick(Sender: TObject);
begin
if DmEmployee.EmployeeDatabase.InTransaction and
(MessageDlg('Are you sure you want to undo all changes made during the ' +
'current transaction?', mtConfirmation, [mbYes, mbNo], 0) = mrYes) then
begin
DmEmployee.EmployeeDatabase.Rollback;
DmEmployee.EmployeeDatabase.StartTransaction;
DmEmployee.EmployeeTable.Refresh;
end else
MessageDlg('Can''t Undo Edits: No Transaction Active', mtError, [mbOk], 0);
end;