用vfp建立3层客户服务器程序

来源:计算机等级考试    发布时间:2012-08-28    计算机等级考试视频    评论

  应用程序开发的一个伟大的事实是:对于每一件事情都可用多种方法来完成.建造应用程序时的最困难的事情是选择一种方法及确定它是否比其它的方法更好. 在客户服务器开发中,这种情况是你是在用两种数据库引擎进行处理, Visual FoxPro 在前端而一个强有力的 SQL 数据库引擎在后端.

  《整合 SQL Server 和 Visual FoxPro》一文探索了用 SQL pass-through. 创建两层客户服务器程序. 在本文中,用Visual FoxPro建立一个 OLE 服务器用于创建三层客户服务器程序. 添加一个中间层,给你以额外的地方来放置代码和执行验证.

  胖客户问题

  客户服务器应用程序开发者如何分离地处理前端和后端的困境是众所周知的. Visual FoxPro 和 SQL Server 两者都具有非常有力的数据库引擎. 两者都有有力的编程语言并有能力验证数据和强制商业规则.

  近来有很多关于工业上的胖客户和瘦客户以及它们对客户服务器应用程序开发的影响. 作为可用的前端开发工具已发展成熟,并有越来越依赖它们的倾向. 后端的负担并不轻,但也会造成问题.

  载入前端的第一个问题是需要一个更为有力的计算机. 当然如果你使用 Visual FoxPro 作为后端你可能需要至少 486 和 12 MB 内存. 这个问题是术语"胖客户"是如何产生的. 如果你正在选择要使用的后端,前端是当然要考虑的. 你会权衡 Visual FoxPro, Visual Basic, Access, Delphi, PowerBuilder, Java 以及其它所有编程语言的优缺点和资源需求. Java 是动人的,因为它提供真正的拥有足够能力的瘦客户前端承诺. Visual FoxPro 5.0 值得注目地比 3.0 减肥.

  前端执行大量处理的第二个问题是假如你的验证和商业规则发生变化你必须修改在前后中的代码. 这可能是或不是一个问题. 假设你正在开发 Visual FoxPro 前端, 你也要发生对 SQL Server 后端的修改. 如果你是验证和商业规则代码的编写者, 你大概会只写一次, 用 Visual FoxPro 或 SQL Server 储存过程或两者的组合. 如果某些方法必须修改,而你是修改者, 很大的问题的代码位于什么地方?

  在另一方面, 你可能编写前端而不写后端. 你可能不被允许编写你自己的 Select, Insert, Update 和Delete. 后端管理人可能限制你只能使用储存过程. 这种方法的好处是保证前端的正确执行. 如果只允许你通过储存过程访问数据, 你将被迫按正确的顺序执行. 例如, 如果你删除一个成员则不能忘记删除该成员的预约. 如果你添加一个新成员则不能忘记放入新的 ID 到 Adult 表中.

  如果你的前端只是一系列访问相同后端的前端的一个又会怎么样呢? 在这种情况下你会想要所有逻辑在后端上发生. 那种方法, 如果要进行任何修改,只需要修改一个地方.

  三层体系

  客户服务器开发最近的一个进步是三层体系方案. 传统的客户服务器是两层的, 由一个客户和一个服务器组成. 正如上面的讨论,如果太多的处理集中在客户或服务器上, 可能会有潜在的问题. 三层体系引入一个中间层, 用于减轻两端的负担.

  在一个典型的三层体系中, 如下表所示, 各层负责提供一个服务. 客户提供用户服务, 它主要由用户界面组成. 服务器提供数据服务, 由数据和维护访问方法组成. 中间层提供商业服务, 由数据验证和强制商业方法组成

  表1: 分层应用程序体系

  要充分认识到该结构的潜力, 你应该使中间层易于访问多个前端. 如果它强制你规则,则所有客户需要与它交谈. 不管客户是用 Visual FoxPro,Visual Basic 还是其它语言写成,这都是事实.

  中间层将会运行于不同的机器上. 这允许它可被多个客户访问,而且它提供最佳性能. 记住, 胖客户问题是客户机器负担过重. 在一个两层结构中你可能必须为每一个客户提供 16 MB (功更多) 内存的 Pentium 机器. 在一个三层结构中你可以将中间层放在一个 32 MB 双处理器 Pentium 机器,并愉快地在 12 MB 内存的486 机器上运行客户程序.

  至少可以用两种方法来设置中间层. 一种方法是用一个 SQL Server 机器作为服务器和中间层. 本文中使用的方法是使用一个在 Visual FoxPro 中创建的 OLE server 作为中间层. OLE server 从 Visual FoxPro 中调用, 或对于任何 OLE 控制器, 使用 CreateObject() 函数, 与你调用 Excel 或 Word 作为 OLE Automation 服务器一样.

  创建Visual FoxPro OLE 服务程序

  如果你还不知道如何在 Visual FoxPro 中创建一个 OLE 服务器请参阅《Visual FoxPro 作为 OLE Automation Servers》 和《自定义 OLE Servers》. 你也可以从 Visual FoxPro 联机帮助文档中 (Visual FoxPro 开发指南第十六章)知道如何做.

  在 Win32 的世界中, OLE 服务器可以作为 InProc 或 OutOfProc 服务器创建(Windows 95 和 Windows NT) ,它是一个运行应用程序的处理并可以寻址到 4 GB 的内存, 一半是用于保存处理代码,另一半是系统使用. InProc 服务器是编译成 DLL 并运行在调用它的过程的相同的地址空间. OutOfProc 服务器是编译成 EXE 文件并作为单独的过程运行. InProc 服务器可提供最佳司长能,因为过程中通信比内部通信慢. 在另一方面, 由于 OutOfProc 服务器运行在一个单独的过程中,你可以利用多处理器的优势.

  OLE 服务器也可在本地或远程运行. 典型地一个远程 OLE 服务器是一个 OutOfProc 服务器并位于超级计算机上. 这允许任意多个客户机器访问它. Remote Automation Connection Manager 可用于配置服务器和客户机器来允许远程自动控制.

  示例数据

  本文使用的示例数据是来自于 SQL Server 6.5 的图书馆应用程序. 图书馆应用程序想要保持对其成员、图书和借阅的跟踪.

  表结构

  图书馆应用程序中的主要表之一是 Member 表, 图书馆中的每一位成员在其中有一条记录. 这里一个有趣的手法是少年必须要有成年人担保才能成为图书馆成员. 大概由于少年会在相同的地方成长为成年人, 因此有两个单独的表 Adult(成年) 和 Juvenile(少年). 这样节约了磁盘空间,因为一但你知道了成人的地址则所有少年的地址信息是多余的. 另外, 少年的期满日期与成人相同. 进一步说, 你不用在意成人的出生日期,你只需注意少年的出生日期及何时满18 岁变为成人(至少在表中要反映出来!).

  以下代码显示了用于创建 Member, Adult 和 Juvenile 表的SQL Server 语句:

  CREATE TABLE member

  ( member_no member_no NOT NULL identity(1,1),

  lastname shortstring NOT NULL ,

  firstname shortstring NOT NULL ,

  middleinitial letter NULL ,

  photograph IMAGE NULL )

  CREATE TABLE adult

  ( member_no member_no NOT NULL ,

  street shortstring NOT NULL ,

  city shortstring NOT NULL ,

  state statecode NOT NULL ,

  zip zipcode NOT NULL ,

  phone_no phonenumber NULL ,

  expr_date DATETIME NOT NULL )

  CREATE TABLE juvenile

  ( member_no member_no NOT NULL ,

  adult_member_no member_no NOT NULL ,

  birth_date DATETIME NOT NULL )

  Member 表中的 member_no 字段在添加新记录时会由 SQL Server 自动生成。该字段是一个 Identity 列。起始值为 1 ,增量值也是 1。这样在表中输入的第一条记录的 member_no 值就是 1。对于后来插入到表中的记录 member_no 的值自动增加 1。当添加一条记录时如果客户没有指定 member_no 的值。SQL Server 自动维护它并询问客户使用什么值。

  在 Adult 和 Juvenile 表中的 member_no 不是 Identity 列。这些记录中的值必须与 Member 表中相应的 member_no 值相匹配。当新记录添加到图书馆库时,一个记录首先会添加到 Member 表中。SQL Server 的全局变量 @@Identity 包含了自动生成的 member_no。然后添加到 Adult 或 Juvenile 表中的记录的 member_no 值将使用 @@Identity 中的值。

  定义参照完整性

  在早期版本的 SQL Server 参照完整性是通过使用触发器强制执行,这与 Visual FoxPro 强制参照完整性相同。SQL Server 6.0 添加了可申明的参照完整性,这允许你定义你自己的作为数据结构一部分的参照完整性规则。第一步是在各表中创建基本关键字约束,如以下代码所示:

  ALTER TABLE member

  ADD constraint member_ident PRIMARY KEY clustered

  (member_no)

  ALTER TABLE adult

  ADD constraint adult_ident PRIMARY KEY clustered

  (member_no)

  ALTER TABLE juvenile

  ADD constraint juvenile_ident PRIMARY KEY clustered

  (member_no)

  基本关键字约束创建一个唯一索引,用于强制 member_no 的唯一性。在示例中创建一组索引用于对数据进行物理排序。

  定义可申明的参照完整性的第二步是在相关表之间创建外部关键字约束,如以下代码所示:

  ALTER TABLE adult

  ADD CONSTRAINT adult_member_link FOREIGN KEY (member_no)

  REFERENCES member (member_no)

  ALTER TABLE juvenile

  ADD CONSTRAINT juvenile_member_link FOREIGN KEY

  (member_no) REFERENCES member (member_no)

  ALTER TABLE juvenile

  ADD CONSTRAINT juvenile_adult_link FOREIGN KEY

  (adult_member_no) REFERENCES adult (member_no)

  第一个 Alter Table 定义了一个 Member 和 Adult 表之间的关系。这是一个一对一关系,虽然这里没有代码指明或强制是这种类型的关系。第二个 Alter Table 在 Member 和 Juvenile 表部定义了一个关系。最后一个 Alter Table 在 Adult 和 Juvenile 表之间定义一个关系。这是一个一对多关系。

  要意识到 SQL Server 当前不支持级联更新或删除。如果你想那样做就应该用触发器代替约束。

  图书馆 OLE 服务程序使用 SQL pass-through 来与 SQL Server 图书馆数据库交谈. 服务器将包含采取行动(如获取一个成员的信息,添加一个新成员修改成员的信息和删除一个成员)的方法. 服务器提供少量的属性, 包括发生了何种错误的属性.

  OLE 服务程序项目是 LIBRARYSERVER.PJX. 该项目包含一个自定义类叫做Members. 该类已被识别为OLE Public (要这样做,在类信息对话框中复选适当的复选项).

  Members 类的成员和属性, 分别在表1 和 表 2中列出.

  方法 可视度 描述

  InitConnection 公共 初始化与SQL Server 的连接

  CloseConnection 公共 关闭与SQL Server 的连接

  GetMember 公共 接收一个成员的信息

  AddMember 公共 添加一个新成员

  UpdateMember 公共 更新一个成员的信息

  RemoveMember 公共 移除一个成员

  SetError 受保护 保存 SQL Server 错误

  Convert 受保护 转换值到串

  表 2: 图书馆 OLE 服务程序属性

  属性 可视度 描述

  NHandle 公共 连接句柄

  NewID 公共 新添加的成员的ID

  LastErrDesc 公共 最后出现的错误的描述

  在图3显示的项目信息对话框中, 项目的名称为 VFPLibraryOLEServer. 结合类名 Members, 就产生了OLE 名称 VFPLibraryOLEServer.Members. 这可以在注册表的 HKEY_CLASSES_ROOT 中找到, 如图4所示.

  OLE 服务程序是在生成时自动注册到机器上. 如果你把它移动到另一台机器上可以用 REGSVR32.EXE 注册它, REGSVR32.EXE 可以在 Windows 95 下的 System 目录和 Windows NT 下的 System32 目录中找到.

  要在客户应用程序上使用 OLE 服务程序,应使用下面这样的代码.

  oLibrary = CreateObject("VFPLibraryOLEServer.Members")

  当 Visual FoxPro 遇到该代码时它首先检查对象名是否是一个 Visual FoxPro 类. 如果不是, 则检查注册表. 当找到对象名和对象的唯一标识符 CLSID, is noted.

  也是在注册表的 HKEY_CLASSES_ROOT 中有一个名为 CLSID 的键值, 它包含一个所有具有 CLSID 的对象的入口. 就象你在图5中看到的一样, 注册表保存着与可执行文件相关的 CLSID. 这就是为什么当 Visual FoxPro 执行它的 CreateObject 命令时 Windows 知道如何启动 OLE 服务程序.

  使用图书馆 OLE 服务程序

  表单 MEMBOLEFP.SCX 使用 Visual FoxPro 图书馆OLE 服务程序作为中间层来与 SQL Server 图书馆数据库图书馆. 在调用服务程序后表单调用方法来获取成员信息, 删除和更新成员等.

上一页12345下一页

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答