服务器

位置:IT落伍者 >> 服务器 >> 浏览文章

DELPHI基础教程:Delphi客户服务器应用开发(四)[3]


发布日期:2019年01月18日
 
DELPHI基础教程:Delphi客户服务器应用开发(四)[3]

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

━━━━━━━━━━━━━━━━━━━━━━━━━━━━

[] [] [] []

               

上一篇:DELPHI基础教程:Delphi客户服务器应用开发(四)[4]

下一篇:DELPHI基础教程:Delphi客户服务器应用开发(四)[2]