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

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

2022-06-13   來源: Delphi編程 

  CREATE TABLE EMPLOYEE (EMP_NO EMPNO NOT NULL

  FIRST_NAME FIRSTNAME NOT NULL

  LAST_NAME LASTNAME NOT NULL

  PHONE_EXT VARCHAR(

  HIRE_DATE DATE DEFAULT NOW NOT NULL

  DEPT_NO DEPTNO NOT NULL

  JOB_CODE JOBCODE NOT NULL

  JOB_GRADE JOBGRADE NOT NULL

  JOB_COUNTRY COUNTRYNAME NOT NULL

  SALARY SALARY NOT NULL

  FULL_NAME COMPUTED BY (last_name || || first_name)

  PRIMARY KEY (EMP_NO))

  CHECK語句是給數據庫字段取值范圍加約束條件PRIMARY_KEY語句是給表建立關鍵字索引

  如法炮制就可以定義IBLOCAL中的所有表

  IBLOCAL中的表包括

  EMPLOYEE CUSTOMER DEPARTMENT EMPLOYEE_PROJECT

  PROJECT SALES SALARY_HISCORY

  各數據庫表中的內容如下

  表 EmployeeDemoDB中各數據庫表的內容

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

  數據庫表名        表中內容

  ───────────────────────────

  EMPLOYEE 雇員信息

  CUSTOMER 客戶信息

  DEPARTMENT 部門信息

  EMPLOYEE_PROJECT 雇員負責的工程

  PROJECT 工程信息

  SALES 銷售信息

  SALARY_HISTORY 雇員薪水調整的歷史信息

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

  每個數據庫表中都定義了關鍵字段關於數據庫表中的字段名類型大小這裡不再贅述

   應用程序分析

   TDatabase部件的使用

  CSDEMO程序中定義了一個數據庫模塊部件TDmEmployee它是繼承於TDataModuleTDataModule是在Delphi中才出現的專門放置數據訪問部件(如TDatabaseTTable和TQuery等)的框架其它涉及數據庫訪問的窗體只要在uses語句中插入數據庫模塊所在的庫單元該窗體上的數據庫部件就可引用相應的數據庫訪問部件

  在TDmEmployee中定義了一個TDatabase類型的部件──EmployeeDatabaseEmployeeDatagase的主要屬性及屬性值如下

  表 EmployeeDatabase部件主要屬性的取值

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

  屬性        屬性值

  ───────────────────────

  AliasName IBLOCAL

  DatabaseName EmployeeDemoDB

  KeepConnection True

  LoginPrompt False

  TransIsolation tiReadCommitted

  Params USERNAME = SYSDBA

  PASSWORD = masterkey

  Connected True

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

  AliasName屬性所指定的IBLOCAL必須已經在BDE中配置好DatabaseName屬性指定要使用的數據庫名該數據庫名是由應用程序自己定義的因此不反應到BDE中該屬性值被TTableTQuery等DataSet部件引用並且出現在DataSet部件的DatabaseName 下拉式列表框中本例中的EmployeeDemoDB被EmployeeTableSalesTable等所有DataSet部件引用

  Connected為True表明應用程序與數據庫將保持聯接

  KeepConnection屬性為True表明多次打開和關閉EmployeeDemoDB數據庫中的任意表應用程序將始終與數據庫保持聯接這省卻了重復注冊的開銷

  LoginPrompt 屬性為False表明應用程序自動處理與數據庫的聯接注冊因此Params屬性中定義了注冊的用戶名和口令

  USERNAME = SYSDBA

  PASSWORD = masterkey

  TransIsolation屬性為tiReadCommitted表明如果存在多個同時事務則某一事務只允許讀由其它事務提交了的數據

  程序中EmployeeDatabase的應用還與事務控制等有關下文中會介紹這方面的內容

   不同數據庫表的切換

  在許多數據庫應用中都要在不同數據庫表之間相互切換以響應用戶輸入條件或系統狀態的變化這時往往需要特別的處理例如改變光標形狀或隱藏數據改變等尤其是在客戶/服務器應用程序中因為是用SQL語句訪問遠程數據庫有時還要在服務器端執行計算任務所以客戶端的數據變化會有一定的間隔因此應該讓用戶明白發生了什麼下面是CSDEMO在數據庫表切換時的處理辦法

  procedure TFrmViewDemoShowTable( ATable: string )

  begin

  ScreenCursor := crHourglass; { 向用戶提示當前操作狀態 }

  VaryingTableDisableControls; { 隱藏數據變化 }

  VaryingTableActive := FALSE; { 關閉原來的數據庫表 }

  VaryingTableTableName := ATable; { 更新數據庫表名 }

  VaryingTableOpen; { 打開數據庫表 }

  VaryingTableEnableControls; { 顯示所作的修改 }

  ScreenCursor := crDefault; { 重新設置光標形狀 }

  end;

  crHourglass型光標表明正在執行SQL查詢DisableControls和EnableControls的作用是隱藏和顯示數據變化

   InterBase觸發器(Trigger)的應用

  在CSDEMO應用程序中演示觸發器應用的窗體是TFromTriggerDemo;

  在該窗體中包含兩個TDBGrid對象DBGrid顯示EmployeeTable中的數據DBGrid顯示SalaryHistoryTable中的數據它們的主要屬性及屬性值如下

  表 EmlpoyeeTable部件主要屬性的取值

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

  屬 性       屬 性 值

  ─────────────────────

  DatabaseName EmployeeDemoDB

  IndexFieldName Emp_No

  TableName EMPLOYEE

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

  表 SalaryHistoryTable部件主要屬性的取值

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

  屬 性       屬 性 表

  ─────────────────────

  DatabaseName EmployeeDemoDB

  IndexFieldName Emp_No

  MasterFields Emp_No

  MasterSource EmployeeSource

  TableName SALARY_HISTORY

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

  這兩個表之間存在兩種關系

  ● 連接關系

  EmployeeTable的記錄變化時SalaryHistoryTable的數據要作相應的變化這種連接關系是通過索引來實現的

  ● 數據一致性

  對EmployeeTable中的Salary字段的值作修改必須反映到SalaryHistoryTable中SalaryHistoryTable維護的是Salary變化的歷史信息這種數據一致性要求在本程序中是通過觸發器實現的

  觸發器是在SQL服務器端執行的一段程序它在服務器端被觸發執行完成一定的數據計算任務

  下面是InterBase服務器上與Employee表相關的觸發器程序

  Triggers on Table EMPLOYEE:

  SAVE_SALARY_CHANGE Sequence: Type: AFTER UPDATE Active AS

  BEGIN

  IF (oldsalary <> newsalary) THEN

  INSERT INTO salary_history

  (emp_no change_date updater_id old_salary percent_change)

  VALUES (

  oldemp_no

  now

  user

  oldsalary

  (newsalary oldsalary) * / oldsalary)

  END

  因為觸發器是相應於EMPLOYEE表上的數據修改由服務器自動觸發執行的所以在客戶應用程序上沒有顯式的調用在客戶端有打開並顯示數據庫表內容的程序和當SALARY_HISTORY表中數據變化時的更新顯示的操作

[]  []  []  []  


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