熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

DELPHI基礎教程:Delphi客戶服務器應用開發(四)[3]

2022-06-13   來源: Delphi編程 

  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

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

[]  []  []  []  


From:http://tw.wingwit.com/Article/program/Delphi/201311/25127.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.