首页 / 软件开发 / Delphi / 第十八章-Delphi客户服务器应用开发(四)(4)
第十八章-Delphi客户服务器应用开发(四)(4)2007-05-07在CSDEMO应用程序中另一个使用存储过程的TStoredProc部件是DeleteEmployeeProc。它完成的任务是删除Employee表中的记录,并修改所有相关的表, 以维护数据的一致性。其属性如下:表18.20 DeleteEmployeeProc部件主要属性的取值 ━━━━━━━━━━━━━━━━━━━━━━━━━━ 属性名 属 性 值 ────────────────────────── DataBaseName EmployeeDemoDBParamBindMode PbByNameParams EMP_NUM(输入参数,整型)StoredProcName DELETE_EMPLOYEE━━━━━━━━━━━━━━━━━━━━━━━━━━存储过程DELETE_EMPLOYEE的程序如下:PROCEDURE DELETE_EMPLOYEEDECLARE VARIABLE any_sales INTEGER;BEGINany_sales = 0;SELECT count(po_number)FROM salesWHERE sales_rep = :emp_numINTO :any_sales;IF (any_sales > 0) THENBEGINEXCEPTION reassign_sales;SUSPEND;ENDUPDATE departmentSET mngr_no = NULLWHERE mngr_no = :emp_num;UPDATE projectSET team_leader = NULLWHERE team_leader = :emp_num;DELETE FROM employee_projectWHERE emp_no = :emp_num;DELETE FROM salary_historyWHERE emp_no = :emp_num;DELETE FROM employeeWHERE emp_no = :emp_num;SUSPEND;ENDParameters: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);beginDmEmployee.EmployeeDatabase.StartTransaction;DmEmployee.EmployeeTable.Open;end;当窗口被关闭或隐藏时,EmployeeDatabase提交事务:procedure TFrmTransDemo.FormHide(Sender: TObject);beginDmEmployee.EmployeeDatabase.Commit;end;窗口中有两个按钮BtnCommitEdits和BtnUndoEdits。按下BtnCommitEdits按钮将提交当前事务,并开始新的事务控制并刷新数据。procedure TFrmTransDemo.BtnCommitEditsClick(Sender: TObject);beginif DmEmployee.EmployeeDatabase.InTransaction and(MessageDlg("Are you sure you want to commit your changes?",mtConfirmation, [mbYes, mbNo], 0) = mrYes) thenbeginDmEmployee.EmployeeDatabase.Commit;DmEmployee.EmployeeDatabase.StartTransaction;DmEmployee.EmployeeTable.Refresh;end elseMessageDlg("Can""t Commit Changes: No Transaction Active", mtError, [mbOk], 0);end;按下BtnUndoEdits按钮将返转当前事物,恢复原来的数据,开始新的事务控制,并刷新数据的显示。procedure TFrmTransDemo.BtnUndoEditsClick(Sender: TObject);beginif DmEmployee.EmployeeDatabase.InTransaction and(MessageDlg("Are you sure you want to undo all changes made during the " +"current transaction?", mtConfirmation, [mbYes, mbNo], 0) = mrYes) thenbeginDmEmployee.EmployeeDatabase.Rollback;DmEmployee.EmployeeDatabase.StartTransaction;DmEmployee.EmployeeTable.Refresh;end elseMessageDlg("Can""t Undo Edits: No Transaction Active", mtError, [mbOk], 0);end;