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

DELPHI基础教程:Delphi客户服务器应用开发(四)[2],第1张

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 PUTED 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 它是继承于TDataModule TDataModule是在Delphi 中才出现的专门放置数据访问部件(如TDatabase TTable和TQuery等)的框架 其它涉及数据库访问的窗体 只要在uses语句中插入数据库模块所在的库单元 该窗体上的数据库部件就可引用相应的数据库访问部件

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

表 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的应用还与事务控制等有关 下文中会介绍这方面的内容

不同数据库表的切换

在许多数据库应用中都要在不同数据库表之间相互切换 以响应用户输入条件或系统状态的变化 这时 往往需要特别的处理 例如改变光标形状或隐藏数据改变等 尤其是在客户/服务器应用程序中 因为是用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的作用是隐藏和显示数据变化

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 (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) / old salary)

END

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

lishixinzhi/Article/program/Delphi/201311/25126

在"约束表达式"框中,为

CHECK

约束键入

SQL

表达式。例如,若要将

authors

表中

state

列的输入在数据库关系图中,右击包含约束的表,然后从快捷菜单中选择"约束"命令。

-或-

为将包含约束的表打开表设计器,在表设计器中右击,然后从快捷菜单中选择"约束"命令。

选择"新建"命令。"选定的约束"框显示由系统分配的新约束名。系统分配的名称以"CK_"开始,后跟表名。

 在"约束表达式"框中,为

CHECK

约束键入

SQL

表达式。例如,若要将

authors

表中

state

列的输入项限制为

New

York,请键入:

state

=

'NY'

 

或者,若要要求

邮编

列中的输入项为

5

位数字,请键入:

邮编

LIKE

'[0-9][0-9][0-9][0-9][0-9][0-9]'

中间不能有空格

1、创建测试表,带主键约束;

create table student2

(Sno char(9) primary key,

Sname char(8) not null,

Ssex char(2) check(Ssex in ('男','女')),

Sage smallint,

Sdept char(20)

)

2、右击表名,点击‘编辑’选项,

3、选择‘键’TAB,并点击右侧删除按钮;

4、即可将主键约束删除;

-- Drop primary, unique and foreign key constraints

alter table STUDENT2

drop constraint SYS_C0018602 cascade;

工具/材料:Management Studio。

1、首先在桌面上,点击“Management Studio”图标。

2、之后在该界面中,点击左上角“新建查询”选项。

3、接着在该界面中,输入使用check约束限定成绩只能为0~100分的sql语句“alter table test1 add constraint ck_cj check(grade>=0 and grade <=100)”。

4、然后在该界面中,点击左上方“执行”按钮。

5、最后在该界面中,显示使用check约束限定成绩只能为0~100分成功。

若您的表名为 course,学分字段名为 credit,则可以使用如下 SQL 语句添加使用 CHECK 约束条件:

ALTER TABLE courseADD CONSTRAINT credit_checkCHECK (credit IN (1, 15, 2, 25, 3, 35, 4, 45, 5));

这个语句将为表 course 中的 credit 字段添加一个名为 credit_check 的 CHECK 约束,该约束条件为学分值只能是 1, 15, 2, 25, 3, 35, 4, 45, 5 中的一个。若您在插入数据时学分值不在这个范围内,将无法插入该记录,从而保证了数据的合法性和完整性。

以上就是关于DELPHI基础教程:Delphi客户服务器应用开发(四)[2]全部的内容,包括:DELPHI基础教程:Delphi客户服务器应用开发(四)[2]、SQL利用check约束语句编写ZIP列 只能是6位的字符数字(邮编必须6位) 请教、如何用SQL语句删除check约束等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9535237.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存