首页 考试吧论坛 Exam8视线 考试商城 网络课程 模拟考试 考友录 实用文档 求职招聘 论文下载
2011中考 | 2011高考 | 2012考研 | 考研培训 | 在职研 | 自学考试 | 成人高考 | 法律硕士 | MBA考试
MPA考试 | 中科院
四六级 | 职称英语 | 商务英语 | 公共英语 | 托福 | 雅思 | 专四专八 | 口译笔译 | 博思 | GRE GMAT
新概念英语 | 成人英语三级 | 申硕英语 | 攻硕英语 | 职称日语 | 日语学习 | 法语 | 德语 | 韩语
计算机等级考试 | 软件水平考试 | 职称计算机 | 微软认证 | 思科认证 | Oracle认证 | Linux认证
华为认证 | Java认证
公务员 | 报关员 | 银行从业资格 | 证券从业资格 | 期货从业资格 | 司法考试 | 法律顾问 | 导游资格
报检员 | 教师资格 | 社会工作者 | 外销员 | 国际商务师 | 跟单员 | 单证员 | 物流师 | 价格鉴证师
人力资源 | 管理咨询师考试 | 秘书资格 | 心理咨询师考试 | 出版专业资格 | 广告师职业水平
驾驶员 | 网络编辑
卫生资格 | 执业医师 | 执业药师 | 执业护士
会计从业资格考试会计证) | 经济师 | 会计职称 | 注册会计师 | 审计师 | 注册税务师
注册资产评估师 | 高级会计师 | ACCA | 统计师 | 精算师 | 理财规划师 | 国际内审师
一级建造师 | 二级建造师 | 造价工程师 | 造价员 | 咨询工程师 | 监理工程师 | 安全工程师
质量工程师 | 物业管理师 | 招标师 | 结构工程师 | 建筑师 | 房地产估价师 | 土地估价师 | 岩土师
设备监理师 | 房地产经纪人 | 投资项目管理师 | 土地登记代理人 | 环境影响评价师 | 环保工程师
城市规划师 | 公路监理师 | 公路造价师 | 安全评价师 | 电气工程师 | 注册测绘师 | 注册计量师
缤纷校园 | 实用文档 | 英语学习 | 作文大全 | 求职招聘 | 论文下载 | 访谈 | 游戏
您现在的位置: 考试吧(Exam8.com) > 计算机等级考试 > 计算机二级 > Delphi > 复习资料 > 正文

2011计算机等考Delphi:Delphi客户服务器应用开发

来源:考试吧Exam8.com) 2010-10-30 9:05:16 考试吧:中国教育培训第一门户 模拟考场
本章中我们将阐述客户服务器体系结构原理、如何用Delphi构建客户/服务器的环境和Delphi存取远程SQL服务器的编程和注意事项。

  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;

  18.4.2.4 存储过程编程

  存储过程也是SQL服务器上的一段程序,它接收输入参数,在服务器端执行,并将结果返回客户端,存储过程是必须在客户应用程序中显式调用的。

  对于数据库表中大量记录的统计和函数计算,存储过程是很有用,这样可以将重复性计算任务转换到服务器,提高数据库应用的性能。

  Delphi中有两个部件能操作远程数据库服务器上的存储过程:TQuery和TStoredProc。

  1. TQuery的存储过程编程

  CSDEMO中演示用TQuery调用存储过程的窗体是TFrmQueryProc。

  TFrmQueryProc中有两个TDBGrid 部件。DBGrid1显示EmployeeTable中的数据。DBGrid2显示Project表中的数据。使用存储过程的TQuery部件名为EmployeeProjectsQuery,它的作用是建立Employee 表和Project 表的连接,以实现当DBGrid1中记录改变时,DBGrid2中的数据作相应的改变。具体的连接任务是由服务器上的存储过程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(5)

  该过程带两个参数:

  EMP_NO是输入参数,类型是SMALLINT.

  PROJ_ID是输出参数,类型是CHAR(5)

  相应地,EmployeeProjectsQuery的主要属性如下:

  表18. 18 EmployeeProjectsQuery部件主要属性的取值

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

  属 性 属 性 值

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

  DatabaseName EmployeeDemoDB

  Params EMP_No(输入参数,Smallint类型)

  SQL Select * from

  Get_Emp_Proj(:EMP_NO)

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

  TQuery部件是在SQL语句中直接调用存储过程。

  下面是客户端的程序:

  procedure TFrmQueryProc.FormShow(Sender: TObject);

  begin

  DmEmployee.EmployeeTable.Open;

  EmployeeSource.Enabled := True;

  with EmployeeProjectsQuery do if not Active then Prepare;

  end;

  用Prepare显式地准备SQL语句,虽非必须,但可以优化SQL的执行。

  procedure TFrmQueryProc.EmployeeDataChange(Sender: TObject; Field: TField);

  begin

  EmployeeProjectsQuery.Close;

  EmployeeProjectsQuery.Params[0].AsInteger :=

  DmEmployee.EmployeeTableEmp_No.Value;

  EmployeeProjectsQuery.Open;

  WriteMsg('Employee ' + DmEmployee.EmployeeTableEmp_No.AsString +

  ' is assigned to ' + IntToStr(EmployeeProjectsQuery.RecordCount) +

  ' project(s).');

  end;

  该事件处理过程与EmployeeSource的OnDataChange属性相联。用于当EmployeeTable数据记录变化时,修正存储过程的输入参数,并执行SQL语句。

上一页  1 2 3 4 5 6 7 8 9 下一页
  相关推荐:2010年9月计算机等级考试试题及答案解析专题
       预告:名师解析2010年9月计算机等级考试试题答案
       2010年9月计算机等级考试成绩查询时间及入口
       2010年9月计算机等考成绩查询短信免费提醒开通
文章搜索
版权声明:如果计算机等级考试网所转载内容不慎侵犯了您的权益,请与我们联系800@exam8.com,我们将会及时处理。如转载本计算机等级考试网内容,请注明出处。