procedure TFrmTriggerDemoFormShow(Sender: TObject)
begin
DmEmployeeEmployeeTableOpen;
DmEmployeeSalaryHistoryTableOpen;
end;
procedure TDmEmployeeEmployeeTableAfterPost(DataSet: TDataSet)
begin
{ 一个雇员的薪水变化将触发薪水调整历史记录的变化
因此如果SalaryHistory打开的话就需要更新显示 }
with SalaryHistoryTable do if Active then Refresh;
end;
存储过程编程
存储过程也是SQL服务器上的一段程序它接收输入参数在服务器端执行并将结果返回客户端存储过程是必须在客户应用程序中显式调用的
对于数据库表中大量记录的统计和函数计算存储过程是很有用这样可以将重复性计算任务转换到服务器提高数据库应用的性能
Delphi中有两个部件能操作远程数据库服务器上的存储过程TQuery和TStoredProc
TQuery的存储过程编程
CSDEMO中演示用TQuery调用存储过程的窗体是TFrmQueryProc
TFrmQueryProc中有两个TDBGrid 部件DBGrid显示EmployeeTable中的数据DBGrid显示Project表中的数据使用存储过程的TQuery部件名为EmployeeProjectsQuery它的作用是建立Employee 表和Project 表的连接以实现当DBGrid中记录改变时DBGrid中的数据作相应的改变具体的连接任务是由服务器上的存储过程Get_Emp_Proj完成下面是Get_Emp_Proj的程序
PROCEDURE Get_Emp_Proj
BEGIN
FOR SELECT proj_id
FROM employee_project
WHERE emp_no = :emp_no
INTO :proj_id
DO
SUSPEND;
END
EMP_NO INPUT SMALLINT
PROJ_ID OUTPUT CHAR()
该过程带两个参数
EMP_NO是输入参数类型是SMALLINT
PROJ_ID是输出参数类型是CHAR()
相应地EmployeeProjectsQuery的主要属性如下
表 EmployeeProjectsQuery部件主要属性的取值
━━━━━━━━━━━━━━━━━━━━━━━━━━
属 性 属 性 值
──────────────────────────
DatabaseName EmployeeDemoDB
Params EMP_No(输入参数Smallint类型)
SQL Select * from
Get_Emp_Proj(EMP_NO)
━━━━━━━━━━━━━━━━━━━━━━━━━━
TQuery部件是在SQL语句中直接调用存储过程
下面是客户端的程序
procedure TFrmQueryProcFormShow(Sender: TObject)
begin
DmEmployeeEmployeeTableOpen;
EmployeeSourceEnabled := True;
with EmployeeProjectsQuery do if not Active then Prepare;
end;
用Prepare显式地准备SQL语句虽非必须但可以优化SQL的执行
procedure TFrmQueryProcEmployeeDataChange(Sender: TObject; Field: TField)
begin
mployeeProjectsQueryClose;
EmployeeProjectsQueryParams[]AsInteger :=
DmEmployeeEmployeeTableEmp_NoValue;
EmployeeProjectsQueryOpen;
WriteMsg(Employee + DmEmployeeEmployeeTableEmp_NoAsString +
is assigned to + IntToStr(EmployeeProjectsQueryRecordCount) +
project(s))
end;
该事件处理过程与EmployeeSource的OnDataChange属性相联用于当EmployeeTable数据记录变化时修正存储过程的输入参数并执行SQL语句
TStoredProc部件的存储过程编程
TStoredProc Delphi 专门用来使用服务器存储过程的部件CSDEMO 中演示用TStoredProc调用存储过程的窗体是TFrmExecPr
在程序运行中当按下ShipOrder按钮要求对ORED_STA_TUS等字段的内容作修改以维护数据库的一致性字段内容的修改任务由服务器上的存储过程SHIP_ORDER完成SHIP_ORDE的程序如下
PROCEDURE SHIP_ORDER
DECLARE VARIABLE ord_stat CHAR()
DECLARE VARIABLE hold_stat CHAR()
DECLARE VARIABLE cust_no INTEGER;
DECLARE VARIABLE any_po CHAR()
BEGIN
SELECT sorder_status con_hold ccust_no
FROM sales s customer c
WHERE po_number = :po_num
AND scust_no = ccust_no
INTO :ord_stat :hold_stat :cust_no;
IF (ord_stat = shipped) THEN
BEGIN
EXCEPTION order_already_shipped;
SUSPEND;
END
ELSE IF (hold_stat = *) THEN
BEGIN
EXCEPTION customer_on_hold;
SUSPEND;
END
FOR SELECT po_number
FROM sales
WHERE cust_no = :cust_no
AND order_status = shipped
AND paid = n
AND ship_date < NOW
INTO :any_po
DO
BEGIN
EXCEPTION customer_check;
UPDATE customer
SET on_hold = *
WHERE cust_no = :cust_no;
SUSPEND;
END
UPDATE sales
SET order_status = shipped ship_date = NOW
WHERE po_number = :po_num;
SUSPEND;
END
Parameters:
PO_NUM INPUT CHAR()
该过程只带有一个输入参数PO_NUM类型是CHAR()
在客户端使用该过程的TStoreProc部件是ShipOrderProc其主要属性如下表
表 ShipOrderProc部件主要属性的取值
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
属性名 属 性 值
────────────────────────────
DatabaseName EmployeeDemoDB
ParamBindMode pbByName
Params PO_NUM(输入参数String类型)
StoredProcName SHIP_ORDER
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[] [] [] []