第十八章-Delphi客户服务器应用开发(四)(2)

18.4.1.2 数据库结构介绍

 IBLOCAL数据库的结构都是由InterBase服务器工具交互式SQL工具(ISQL)定义的。

用ISQL定义数据库,首先要用Create Database命令建立数据库,建立的新数据库一般是以GDB为扩展名。建立好后,就可以用SQL语言定义数据库表,例如建立EMPLOYEE表的SQL语句如下:

定义域名数据类型:

CREATE DOMAIN FIRSTNAME AS VARCHAR(15);

CREATE DOMAIN LASTNAME AS VARCHAR(20);

CREATE DOMAIN COUNTRYNAME AS VARCHAR(15);

CREATE DOMAIN EMPNO AS SMALLINT;

CREATE DOMAIN DEPTNO AS CHAR(3)

CHECK (VALUE = '000' OR (VALUE > '0' AND VALUE <= '999') OR VALUE IS NULL);

CREATE DOMAIN JOBCODE AS VARCHAR(5)

CHECK (VALUE > '99999');

CREATE DOMAIN JOBGRADE AS SMALLINT

CHECK (VALUE BETWEEN 0 AND 6);

CREATE DOMAIN SALARY AS NUMERIC(15, 2)

DEFAULT 0

CHECK (VALUE > 0);

建立EMPLOYEE表:

CREATE TABLE EMPLOYEE (EMP_NO EMPNO NOT NULL,

FIRST_NAME FIRSTNAME NOT NULL,

LAST_NAME LASTNAME NOT NULL,

PHONE_EXT VARCHAR(4),

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

各数据库表中的内容如下:

表18.14 EmployeeDemoDB中各数据库表的内容

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

  数据库表名        表中内容

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

     EMPLOYEE 雇员信息

 CUSTOMER 客户信息

DEPARTMENT 部门信息

EMPLOYEE_PROJECT 雇员负责的工程

PROJECT 工程信息

SALES 销售信息

SALARY_HISTORY 雇员薪水调整的历史信息

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

每个数据库表中都定义了关键字段。关于数据库表中的字段名、类型、大小,这里不再赘述。

18.4.2 应用程序分析

18.4.2.1 TDatabase部件的使用

CSDEMO程序中定义了一个数据库模块部件——TDmEmployee,它是继承于TDataModule。TDataModule是在Delphi2.0中才出现的专门放置数据访问部件(如TDatabase、TTable和TQuery等)的框架。其它涉及数据库访问的窗体,只要在uses语句中插入数据库模块所在的库单元,该窗体上的数据库部件就可引用相应的数据库访问部件。

在TDmEmployee中定义了一个TDatabase类型的部件──EmployeeDatabase。EmployeeDatagase的主要属性及属性值如下:

表18.15 EmployeeDatabase部件主要属性的取值

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

    属性        属性值

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

    AliasName IBLOCAL

DatabaseName EmployeeDemoDB

KeepConnection True

LoginPrompt False

TransIsolation tiReadCommitted

Params USERNAME = SYSDBA

PASSWORD = masterkey

Connected True

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

AliasName属性所指定的IBLOCAL,必须已经在BDE中配置好,DatabaseName属性指定要使用的数据库名,该数据库名是由应用程序自己定义的,因此不反应到BDE中,该属性值被TTable、TQuery等DataSet部件引用,并且出现在DataSet部件的DatabaseName 下拉式列表框中。本例中的“EmployeeDemoDB”,被EmployeeTable,SalesTable等所有DataSet部件引用。

Connected为True表明,应用程序与数据库将保持联接。

KeepConnection属性为True,表明多次打开和关闭EmployeeDemoDB数据库中的任意表,应用程序将始终与数据库保持联接,这省却了重复注册的开销。

LoginPrompt 属性为False,表明应用程序自动处理与数据库的联接注册,因此,Params属性中定义了注册的用户名和口令:

USERNAME = SYSDBA

PASSWORD = masterkey

TransIsolation属性为tiReadCommitted表明,如果存在多个同时事务,则某一事务只允许读由其它事务提交了的数据。

程序中EmployeeDatabase的应用还与事务控制等有关。下文中会介绍这方面的内容。

18.4.2.2 不同数据库表的切换

在许多数据库应用中都要在不同数据库表之间相互切换,以响应用户输入条件或系统状态的变化。这时,往往需要特别的处理,例如改变光标形状或隐藏数据改变等,尤其是在客户/服务器应用程序中。因为是用SQL语句访问远程数据库,有时还要在服务器端执行计算任务,所以客户端的数据变化会有一定的间隔,因此应该让用户明白发生了什么。下面是CSDEMO在数据库表切换时的处理办法:

procedure TFrmViewDemo.ShowTable( ATable: string );

begin

Screen.Cursor := crHourglass; { 向用户提示当前操作状态 }

VaryingTable.DisableControls; { 隐藏数据变化 }

VaryingTable.Active := FALSE; { 关闭原来的数据库表 }

VaryingTable.TableName := ATable; { 更新数据库表名 }

VaryingTable.Open; { 打开数据库表 }

VaryingTable.EnableControls; { 显示所作的修改 }

Screen.Cursor := crDefault; { 重新设置光标形状 }

end;

crHourglass型光标表明正在执行SQL查询。DisableControls和EnableControls的作用是隐藏和显示数据变化。

18.4.2.3 InterBase触发器(Trigger)的应用

在CSDEMO应用程序中,演示触发器应用的窗体是TFromTriggerDemo;

在该窗体中包含两个TDBGrid对象。DBGrid1显示EmployeeTable中的数据,DBGrid2显示SalaryHistoryTable中的数据。它们的主要属性及属性值如下:

表18.16 EmlpoyeeTable部件主要属性的取值

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

    属 性       属 性 值

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

     DatabaseName EmployeeDemoDB

IndexFieldName Emp_No

TableName EMPLOYEE

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

表18.17 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: 0, Type: AFTER UPDATE, Active AS

BEGIN

IF (old.salary <> new.salary) THEN

INSERT INTO salary_history

(emp_no, change_date, updater_id, old_salary, percent_change)

VALUES (

old.emp_no,

'now',

user,

old.salary,

(new.salary - old.salary) * 100 / old.salary);

END

因为触发器是相应于EMPLOYEE表上的数据修改由服务器自动触发执行的,所以在客户应用程序上没有显式的调用。在客户端有打开并显示数据库表内容的程序和当SALARY_HISTORY表中数据变化时的更新显示的操作。

procedure TFrmTriggerDemo.FormShow(Sender: TObject);

begin

DmEmployee.EmployeeTable.Open;

DmEmployee.SalaryHistoryTable.Open;

end;

procedure TDmEmployee.EmployeeTableAfterPost(DataSet: TDataSet);

begin

{ 一个雇员的薪水变化将触发薪水调整历史记录的变化,

因此,如果SalaryHistory打开的话,就需要更新显示 }

with SalaryHistoryTable do if Active then Refresh;

end;

时间: 2024-08-30 11:01:09

第十八章-Delphi客户服务器应用开发(四)(2)的相关文章

第十八章-Delphi客户服务器应用开发(二)(2)

BDE在设计上是面向对象的.在运行时,数据库应用通过建立各种类型的BDE 对象与BDE交互,这些运行的对象用于操作数据库实体如数据库表.查询.BDE的扩展的API支持C.C++.Delphi等对数据库引擎的访问. 在Delphi应用程序中访问数据库是通过调BDE的API函数.Delphi在库单元BDE中提供了大约三十多个API函数和各种BDE消息和结构.由于Delphi应用程序的开发是基于部件的,有关BDE API的调用都嵌入了Delphi可视部件类库,因此,建立数据库应用时可以不必管BDE A

第十八章-Delphi客户服务器应用开发(一)(1)

客户/服务器的开发工作涉及定义客户/服务器的体系结构, 然后再将该结构与其它一些对于客户/服务器的实现至关重要的系统结构和技术集成起来.Delphi 2.0的Client/Sever版支持用户开发客户/服务器结构的应用程序.本章中我们将阐述客户服务器体系结构原理.如何用Delphi构建客户/服务器的环境和Delphi存取远程SQL服务器的编程和注意事项. 18.1 Delphi客户/服务器应用开发原理 18.1.1 客户/服务器体系结构 18.1.1.1 体系结构概述 客户/服务器系统的体系结构

第十八章-Delphi客户服务器应用开发(一)(4)

18.1.3.5 Oracle RDBMS Oracle RDBMS为以任务为中心的企业范围的应用提供所需要的操作.监督和管理软件.使用Oracle RDBMS的分布式数据库和网点能力,用户可以透明地集成该企业的新旧数据.系统和应用程序.Oracle被分组形成几个软件包,使得客户可选地获取他们自己的应用所需要的功能.这些软件包是: ● 标准Oracle软件包 ● 过程化选件软件包 ● 分式式对象软件包 ● 并行服务器选件软件包 ● 开放网关软件包 标准Oracle软件包提供解决大量关键任务的联机

第十八章-Delphi客户服务器应用开发(四)(1)

18.3.4.1 适化概述 所谓适化就是将桌面应用转化为Client/Server应用. 适化是一个很复杂的主题,这里不详细讲述.本节将介绍适化Delphi 应用程序中最重要的方面. 适化的主要方面有: ● 将数据库从桌面平台到服务器的适化 ● 将应用程序转化为Client/Server的适化 适化还需要实现从桌面环境到Client/Server环境的转化. 桌面数据库和SQL服务器数据库在许多方面有不同之处.例如: ● 桌面数据库用于同一时刻单用户的访问,而服务器用于多用户访问 ● 桌面数据库

第十八章-Delphi客户服务器应用开发(二)(1)

18.1.4.1 本地型数据库接口 本地型数据库是伴随微机的产生而产生的.dBASEII作为最早的并仍在使用的系统之一就是典型的本地型数据库. 本地型数据库管理系统的数据存放在一个本地硬盘上.DBMS接受来自用户或用户程序的命令.这些命令通常是系统特有的数据库管理语言.命令被转换为简单的磁盘访问命令,并交付文件系统来处理.然后DBMS接收来自磁盘上的数据,并加以处理. 在本地型DBMS应用中,数据库引擎(DBE)运行于工作站上.图18.2暗示数据是存放在工作站的局部驱动器上,其实在网络中,数据还

第十八章-Delphi客户服务器应用开发(一)(3)

18.1.3 各种数据库服务器功能介绍 服务器数据管理包括若干软件,它们使用户可以访问网络中的任何节点以及确保多用户环境下的保密性.可恢复性和完整性.如前面所提到的,客户/服务器计算中的基本存取链路是SQL,它是一种高级非过程数据库语言, 现在已开发出很多支持SQL 的后端服务器及DBMS.下面将描述这些产品. 18.1.3.1 DB2 DB2是一种由IBM公司开发的RDBMS.它使用SQL执行所有的数据库操作.数据定义.数据存取.数据操作以及授权功能.SQL语句由用户在一个客户机节点从键盘输入

第十八章-Delphi客户服务器应用开发(一)(2)

18.1.1.4 中间件概述 中间件是一个软件层,它保护应用程序开发人员避免受到各种通信协议.操作系统以及数据库管理系统的影响.它为建立可与以前沿袭下来的应用程序并存的新应用程序打下了基础. 中间件有好几种类型.它们包括应用程序设计接口(API),远程过程调用(RPC),网络通信.数据库访问以及计算机辅助软件工程(CASE)工具. 由于客户/服务器系统需要集成各种不同结构的机器和技术,因而应用程序设计相当复杂.选择适当的中间件可以消除程序设计人员为每个单独协议和操作系统编写代码的麻烦. 18.1

第十八章-Delphi客户服务器应用开发(四)(4)

在CSDEMO应用程序中另一个使用存储过程的TStoredProc部件是DeleteEmployeeProc.它完成的任务是删除Employee表中的记录,并修改所有相关的表, 以维护数据的一致性.其属性如下: 表18.20 DeleteEmployeeProc部件主要属性的取值 ━━━━━━━━━━━━━━━━━━━━━━━━━━ 属性名 属 性 值 ────────────────────────── DataBaseName EmployeeDemoDB ParamBindMode PbB

第十八章-Delphi客户服务器应用开发(三)(5)

18.3.3 使用存储过程 18.3.3.1 TStoredProc部件概述 存储过程是以数据库服务器为基础的接受输入参数,并将结果返回给应用程序的一段程序.TStoredProc部件操作远程服务器上的数据库中的存储过程.存储过程是一连串表达式的集合,作为服务器的一部分存储.存储过程在服务器上执行一系列重复性的与数据库相关的任务,并将结果传给客户应用程序,如Delphi数据库应用程序. TStaredProc部件使Delphi数据库应用程序能执行服务器上的存储过程. 通常,作用于数据库表中大量记