程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 第十八章-Delphi客戶服務器應用開發(四)(4)

第十八章-Delphi客戶服務器應用開發(四)(4)

編輯:Delphi

在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;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved