客户/服务器的开发工作涉及定义客户/服务器的体系结构 然后再将该结构与其它一些对于客户/服务器的实现至关重要的系统结构和技术集成起来 Delphi 的Client/Sever版支持用户开发客户/服务器结构的应用程序 本章中我们将阐述客户服务器体系结构原理 如何用Delphi构建客户/服务器的环境和Delphi存取远程SQL服务器的编程和注意事项
Delphi客户/服务器应用开发原理
客户/服务器体系结构
体系结构概述
客户/服务器系统的体系结构有以下两个特点
● 是集合智能用户工作站作为有效平台使用
● 平台和软件之间的互操作性
客户/服务器结构包括连接在一个网络中的多台计算机 那些处理应用程序 请求另一计算机的服务的计算机称为客户机(Client) 而处理数据库的计算机称为服务器(Server) 所有用户都拥有他们自己的计算机来处理应用程序
客户机计算机可以是大型机 小型机或微机 但是由于微机具有成本的优势 因而通常选择它们作为客户机 同样地 服务器通常是一台微机但在需要较大能力时 也可以使用一台大型机或小型机 在数据库环境下 通过若干称作中间件(Middleware)的程序设计接口 客户机可以与服务器通信 这些接口提供应用程序和数据库之间的连通性
客户/服务器结构也可以包括多个服务器 然而在这种情况下 每个服务器必定只处理一个不同的数据库或提供一个唯一的服务 (注意 使用两上或多个服务器来处理同一个数据库的结构不认为是客户/服务器系统 相反它是一个分布式数据库系统〕
表 归纳了计算机在客户/服务器系统中的既定作用
表 客户机和服务器计算机的作用
━━━━━━━━━━━━━━━━━━━━━━━━━━━
客户机功能 服务器功能
───────────────────────────
管理用户接口 从客户机接受数据库请求
从用户接受数据 处理数据库请求
处理应用逻辑 格式化结果并传送给客户机
产生数据库请求 执行完整性检查
向服务器发送数据库请求 提供并行访问控制
从服务器接收结果 执行恢复
格式化结果 优化查询和更新处理
━━━━━━━━━━━━━━━━━━━━━━━━━━━
客户机概述
如上所述 客户机运行那些使用户能阐明其服务请求的程序 并将这些请求传送到服务器 由客户机执行的计算称为前端处理(front end processing) 前端处理具有所有与提供 操作和显示数据相关的功能
客户机软件由网络接口软件 支持用户需求的应用程序以及实现网络能力的实用程序【例如电子邮件(E Mail)和群件(Groupware)】组成 网络接口软件提供各种数据传输服务 应用程序软件执行具体的任务 如字处理 电子表格和数据库查询生成 实用程序软件通常执行几乎所有网络用户都要求的标准任务
服务器概述
在服务器上执行的计算称为后端处理(back end processing) 后端硬件(back end hardware)是一台管理数据资源并执行数据库引擎功能(如存储 操作和保护数据)的计算机 在大型机环境下 后端网络(back end neork)提供大型计算机至大容量存储设备 控制器以及文件服务器的连接 在识别 评价和选择适当的服务器平台时 必须考虑将由该平台提供的服务 例如 一个数据库服务器可能需要快速处理能力 其他可能需要执行的网络服务有通信 应用程序 文件访问以及只读存储器(CD ROM)服务 随着新的应用技术的广泛使用 可被提供的潜在服务还将继续增加
服务器软件既包括遵循于OSI或其它网络结构的网络软件 又包括由该服务器提供给网络上客户机的应用程序或服务软件
中间件概述
中间件是一个软件层 它保护应用程序开发人员避免受到各种通信协议 操作系统以及数据库管理系统的影响 它为建立可与以前沿袭下来的应用程序并存的新应用程序打下了基础
中间件有好几种类型 它们包括应用程序设计接口(API) 远程过程调用(RPC) 网络通信 数据库访问以及计算机辅助软件工程(CASE)工具
由于客户/服务器系统需要集成各种不同结构的机器和技术 因而应用程序设计相当复杂 选择适当的中间件可以消除程序设计人员为每个单独协议和操作系统编写代码的麻烦
lishixinzhi/Article/program/Delphi/201311/25137自动化是从一个应用程序内部自动控制另一个应用程序的方法 例如下面的代码 procedure CreateNewWordvarWordObj: VariantbeginWordObj := CreateOleObject( Word Basic ){此函数声明于ComObj单元}WordObj AppShowWordObj FileNewend这段代码将会打开WORD 并自动建立一个新的文档(当然前提是你的机子上安装了WORD) 这看来很有趣 也是一种非常有用的功能 那么如何让我们的程序也拥有类似WORD等的自动化功能并能让其它任何语言开发的程序对我们的程序进行自动化呢?用DELPHI来实现非常简单
这篇文章将会以实例形式一步步的来说明如何开发一个简单的自动化服务器
新建一个普通的应用程序 将工程保存为AutoSrv bpr 在主窗体上放一个Edit控件 并保存为MainForm pas 在这里我们打算给这个程序加上对窗口标题 窗体颜色 和Edit控件文本的自动化控制(当然这实现的功能很少 但对于讲解如何开发自动化服务器程序足够了) 在主窗口中加入如下代码:(注意:请自行将这些函数和过程的声明加入TForm 的public区)function TForm GetCaption: stringbeginresult := Self Captionend
procedure TForm SetCaption(ACaption: string)beginSelf Caption := ACaptionend
procedure TForm SetColor(AColor: TColor)beginSelf Color := AColorend
procedure TForm SetEditText(AText: string)beginSelf Edit Text := ATextend然后我们来给这个程序加上自动化的功能 点击New Items按钮 在弹出的New Items窗口中点击ActiveX选项卡 选择Automation Object点击OK按钮 在弹出的Automation Object Wizard窗口中CoClass Name一项中输入MyAutoSrv Delphi就会自动生成一个AutoSrv_TLB pas文件(类库)和实现类库接口类的单元 将这个新的单元保存为AutoSrvClass pas.
现在这个程序已经成为一个自动化服务器了 我们再来为其加上自动化的接口函数:( )点击View >Type Libray菜单 在Type Library Editor选择IMyAutoSrv接口 点击New Property 选择其属性为Read|Write 并把其命名为Caption Type设定为BSTR ( )点击New Method 将其命名为SetColor 点击右边的Parameters选项卡 点击ADD为新添的接口函数添加一个参数 将参数名设为AColor 参数Type设为OLE_COLOR ( )再次点击New Method 将其命名为SetEditText 以上面的方法为其添加一个参数 将参数名设为AText 参数Type设为BSTR
最后添加上接口函数的实现代码就OK了:在AutoSrvClass pas的Uses部分添加上MainForm 并将其代码改为如下代码 unit AutoSrvClass
{$WARN SYMBOL_PLATFORM OFF}
interface
usesComObj ActiveX AutoSrv_TLB StdVcl MainForm
typeTMyAutoSrv = class(TAutoObject IMyAutoSrv)protectedfunction Get_Caption: WideStringsafecallprocedure Set_Caption(const Value: WideString)safecallprocedure SetColor(AColor: OLE_COLOR)safecallprocedure SetEditText(const AText: WideString)safecall
end
implementation
uses ComServ
function TMyAutoSrv Get_Caption: WideStringbeginResult := Form GetCaptionend
procedure TMyAutoSrv Set_Caption(const Value: WideString)beginForm SetCaption(Value)end
procedure TMyAutoSrv SetColor(AColor: OLE_COLOR)beginForm SetColor(AColor)end
procedure TMyAutoSrv SetEditText(const AText: WideString)beginForm SetEditText(AText)end
initializationTAutoObjectFactory Create(ComServer TMyAutoSrv Class_MyAutoSrv ciMultiInstance tmApartment)end 运行这个程序一次 将会自动注册为自动化服务器 可以在注册表中的HKEY_CLASSES_ROOT主键下面找到其相关的注册信息
上面演示了如何开发一个自动化服务器 在这里我们将调用它 新建一个程序 添加一个Button 在其VAR区声明一个Variant变量: AutoSrv: variant再在Button 中添加如下代码 procedure TForm Button Click(Sender: TObject)beginAutoSrv := CreateOleObject( AutoSrv MyAutoSrv ){这个字符串就是自动化服务器的工程名加上CoClass Name}Self Caption := AutoSrv CaptionAutoSrv Caption := HEHE AutoSrv SetColor(CLRed)AutoSrv SetEditText( HAHA )end其中的CreateOleObject函数将会返回一个IDispatch类型的接口 正是IDispatch接口让我们的程序可以对自动化服务器接口的调用进行后期连接 比如我们在上面添加一句AutoSrv Hello 程序也能被编释通过 但在执行时就会出错 使用Variant在执行效率上会比直接使用接口声明要慢一些 运行并点击按钮 可以看到自动化服务程序被加载 并按我们的代码设置了窗体色和EDIT 中的字串 呵呵 是不是很简单啊?
lishixinzhi/Article/program/Delphi/201311/24993
TSoredProc的关键属性
⑴ DatabaseName属性
DatabaseName属性描述要访问的数据库的名字 该属性可以为
● 已定义的BDE别名
● 本地型数据库的目录
● Local InterBase服务器的目录路径和文件名
● TDatabase定义的应用程序别名
在改变DatabaseName之前要使用Close方法将Dataset部件置为非活跃状态
⑵ StoredProcName属性
StoredProcName属性表示服务器上的存储过程名 Oracle服务器允许多个具有相同名字的存储过程 因此要设置Overload属性来描述执行在Oracle服务器上的存储过程名
⑶ Overload属性
Oracle服务器允许Oracle软件包中存储过程的重载 就是说具有相同名字的不同过程 设置Overload属性用来描述执行在Oracle服务器上的存储过程 如果Overload值为零 则假定没有重载 如果Overload为 则Delphi执行具有同名的第一个存储过程 如果值为 则执行第二个存储过程
⑷ Params属性
Params属性包含传给存储过程的参数
关键方法
⑴ ParamByName方法
声明 function ParamByName(const Value: String) TParam
ParamByName方法返回Params属性中具有名为Value的元素值 一般用该方法在动态查询中给参数赋值
⑵ Prepare方法
PrePare方法准备要执行的存储过程 这允许服务器载入存储过程 否则准备处理异常
⑶ ExecProc方法
ExecProc方法执行服务器上的存储过程
⑷ Open方法
Open方法打开DataSet部件 并将其置于浏览状态 这相当于将Active属性置为True 对于TStoredProc如果存储过程返回一个结果集 则使用Open执行存储过程 如果存储过程返回单行 早使用ExecProc执行存储过程
TStoreProc使用方法
建立一个StoredProc部件
为数据库服务器上的存储过程建立一个TStoredProc部件的步骤如下
⑴ 从Component Palette的Data Access页选择TStoredProc部件放在数据模块上
⑵ 将TStoredProc部件的DatabaseName属性设置为存储过程所在的数据库名
DatabaseName必须是BDE别名
⑶ 将TStoredProc部件的StoredProcName属性设为所用的存储过程名 或者从下拉式
列表框中选择
⑷ 在TStoredProc部件的Params属性中描述输入参数 可以使用参数编辑器来设置输
入参数 参数编辑器也可让用户察看存储过程返回给应用程序的值
设置存储过程的输入参数 察看输出结果参数
许多存储过程需要给它们传入一系列的输入参数 以确定处理什么和怎样处理 在Params属性中描述这些参数 所描述的输入参数的顺序是很重要的 它由服务器上的存储过程来确定 在设计时 最容易和最安全的方法是激活TStoredProc参数编辑器 编辑输入参数 参数编辑器以正确的次序列出输入参数 让你给它们赋值
要激活TStoredProc的参数编辑器
① 选择TStoredProc部件
② 按鼠标右键激活加速菜单(Speed Menu)
③ 选择Define Parameters
参数名列表框显示过程的所有输入 输出和结果参数 有关输入 输出参数的信息从服务器中获得 对于某些服务器而方 参数信息是不可访问的 如Sybase 在这种情况下 列表框是空的 因此必须自己按过程要求的顺序增加输入输出参数
参数类型复选框中描述所选的参数是输入 输出 还是结果参数 如果服务器支持参数可以既是输入又是输出 如果在列表框中增添参数 就必须设置参数类型
数据类型复选框 列出列表框中所选参数的数据类型 如果给列表框真善美参数 必须设置数据类型
在值编辑框中给输入参数赋值
如果服务器不传递存储过程信息给Delphi 则可以用Add按钮给存储过程增添参数 Delete按钮则是将增添的参数删除 Clear按钮将清除列表框中所有参数
设置完参数后 选择OK按钮
在运行时建立参数和参数值
在运行时建立参数 可直接访问Params属性 Params属性是参数字符串的数组 例如 下列代码将编辑框的文本赋给数组的第一个字串
StaredProc Params[ ] Asstring := Edit Text
也能够用ParamsByName方法通过名字访问参数
StoredProc ParamsByName( Company ) Asstring := Edit Text
准备和执行存储过程
要使用存储过程还必须准备并执行它 可以有两种方式准备一个存储过程
● 在设计时 通过选择参数编辑器的OK按钮
● 在运行时 通过调用TStoredProc的Prepare方法
例如 下面的代码准备存储过程的执行
StoredProc Prepare
要执行准备好的存储过程 调用TStroedProc部件的ExecProc方法 下列代码演示了准备和执行存储过程
StoredProc Params[ ] Asstring := Edit Text
StoredProc prepare
StoredProc ExecProc
当你执行一个存储过程 它返回输出参数或结果集 有两种可能的返回类型 单个返回 如单值或值集 和一群结果集 返回很多值
访问输出参数和结果集
存储过程在输出参数数组中返回值 如果服务器支持返回值可以是单个结果或者结果集
在运行时访问存储过程的输出参数 可以索引Params属性或者用ParamByName方法访问这些值 下列表达式都用输出参数设置了编辑框的值
Edit Text := StoredProc Params[ ] AsString
Edit Text := StoredProc ParamsByName( Contact ) AsString
如果存储过程返回结果集 则用标准数据相关控制访问和显示值会更有用
在某些服务器上如Sybase 存储过程能象查询语句那样返回结果集 应用程序可以使用数据相关控制一显示这些存储过程的输出
用数据相关控制显示存储过程返回结果的方法如下
① 将DataSource部件放在数据模块上
② 将DataSource部件的DataSet属性设置为接收数据的TStoredProc部件的名字
③ 将数据相关控制的DataSource属性设为DataSource部件的名字
这样 当用于TStoredProc部件和Active属性为True时 数据相关控制就能显示从存储过程返回的结果
返回目录 DELPHI基础教程
编辑推荐
Java程序设计培训视频教程
J EE高级框架实战培训视频教程
Visual C++音频/视频技术开发与实战
Oracle索引技术
ORACLE G数据库开发优化指南
Java程序性能优化 让你的Java程序更快 更稳定
C嵌入式编程设计模式
Android游戏开发实践指南
lishixinzhi/Article/program/Delphi/201311/25132
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)