利用 dbExpress 创建可重用组件来将 Delphi 7 连接到 DB2

在 Borland Delphi 中利用 Delphi 7 中的 dbExpress 创建可重用跨库组件(CLX)来将 Delphi 应用程序连接到 IBM DB2 数据库

简介

在 本文中,我将演示如何将 IBM® DB2® Universal Database™ 用作以 Borland® Delphi™ 7 和 dbExpress™ 编写的应用程序的后端数据库。具体地说,我将演示:如何将七个 dbExpress 组件连接到 DB2,然后用它们以数据库表为基础构建可视化窗体。如果您不能连接到 DB2 数据库,那么您可以从 IBM 网站 http://www14.software.ibm.com/webapp/download/category.jsp?s=c&cat=data下载免费试用版 DB2 或最新的 beta 测试版 DB2。

我在本文中使用 DB2 样本数据库。如果您想随我一起做,那么您也需要创建这一数据库,可以使用 DB2“First Steps”实用程序(一个工具,强烈建议象您这样以前没怎么使用过 DB2 的人使用它)来完成这一任务。

Delphi 7 和 dbExpress 概述

Delphi 带有多种数据访问库,如 Borland 数据库引擎(Borland Database Engine, BDE)、dbGo for ADO 以及 SQL Links。最后那个库具备连接到 DB2 数据库的功能,但 Borland 却不赞成使用它,这意味着到 2002 年以后将不再支持 SQL Links。幸运的是,Delphi 自版本 6 以后就推出了称为 dbExpress 的替代数据访问技术。开发 dbExpress 的初衷是打算将其作为 Linux® 中 Kylix™ 的数据访问层,而现在它已成为用于 Delphi、C++Builder™ 和 Kylix(既包括 Delphi 版本也包括 C++ 版本)的功能强大的跨平台数据访问层。本文将使用这些工具的企业版中所包含的 dbExpress DB2 驱动程序。

让我们开始编码

开始前,请确保 DB2 正在运行(缺省情况下它应该正在运行),然后用 File ->New CLX Application 启动一个新的 CLX 工程。(CLX 代表跨平台组件库 (Component Library for (cross)X-platform)。我之所以将它构建为 CLX 应用程序,是因为我想在将来的文章中将它迁移到 Linux。)接下来,将空的主窗体保存在 MainForm.pas 中,而将工程保存在 DB2D7.dpr 中。

要连接到 DB2 数据库,首先要从 Delphi Component Palette 的 dbExpress 选项卡选取 TSQLConnection 组件。TSQLConnection 就是使用 dbExpress 层连接到 DBMS 的组件。您可以使用 DriverName 属性来选择诸如 DB2、InterBase®、MYSQL™ 或 Oracle® 之类的驱动程序。不过,您经常可以获得已经在 ConnectionName 中定义好的(到特定数据库的)特定连接信息,因此您也可以使用该属性,并选择 DB2Connection 值。

一旦您设置了 DriverName 或 ConnectionName 属性值,诸如 GetdriverFunc、LibraryName 和 VendorLib 之类的其它属性也将自动获得值:

  • LibraryName 指定与 DB2 通信的 dbExpress 库。
  • GetdriverFunc 是该 dbExpress 库中入口点的名称。
  • VendorLib 指定 DB2 所需的 DB2 库的名称。(该库是由 IBM 提供的,如果您正在使用 DB2,那么它应该已经在您的系统上)。

如果您在 TSQLConnection 组件上单击鼠标右键,那么您可以在 dbExpress Connections 属性对话框中选择更多特定连接选项(请参阅 图 1)。注:我已将 Database 设置为 SAMPLE。您还可以在这里确定您的 User_Name 和 Password。


图 1. dbExpress Connections 属性。
dbExpress 属性

一旦设置好了一切,就请关闭 Connections 属性对话框,然后将 TSQLConnection 组件的 Connected 属性设置为 True。 这会导致出现标准的 Database Login 对话框。如果您不想看到这个对话框(因为您已经在 Connection Settings 中指定了 User_Name 和 Password),那么您就可以将 TSQLConnection 组件的 LoginPrompt 属性设置为 False

成功登录之后,应用程序将具有到 DB2 SAMPLE 数据库的连接。现在是使用 TSQLTable、TSQLQuery、TSQLStoredProc 或 TSQLDataSet 组件从该数据库检索信息的时候了。

利用 TSQLTable 开始在您的应用程序中显示 DB2 数据

要 开始使用 TSQLTable,请在窗体上放入 TSQLTable 组件,然后将其 Connection 属性指定为 TSQLConnection 组件。您现在可以使用 TableName 属性从 SAMPLE 数据库的表(即 CL_SCHED、DEPARTMENT、EMP_ACT、EMP_PHOTO、EMP_RESUME、EMPLOYEE、IN_TRAY、ORG、 PROJECT、SALES 和 STAFF)中选择其中之一。选择 employee 表。

在继续之前,对于 dbExpress 您必须清楚一点,这一点与 Delphi 中旧的数据访问库(如 BDE 和 SQL Links)不同:dbExpress 数据集是个只读、单向的数据集。这意味着应用程序可以打开该表,然后可以从第一个记录遍历到最后一个记录,但应用程序不能反向移动(或跳到最后一条记 录),也不能对表做任何修改。数据集的行为就象执行 SQL 查询,能够一次一条地查看生成的记录,但仅此而已。dbExpress 数据集这样运行以达到最佳性能:对生成数据的访问快速而且不需要多少开销。此外,很多时候,您确实只想遍历结果集一次(例如,在一个报表生成或 Web 服务器应用程序中),因此,如果您并不总是要用到它,那为什么要增加开销呢?

当 激活 TSQLTable 时,应用程序检索 employee 表(作为只读、单向数据集)的内容。为了让您的应用程序遍历这张表并对其做些修改,应用程序必须将内容放在本地高速缓存 — TClientdataSet 中。为了将它添加到应用程序中,请从 Component Palette 的 Data Access 选项卡中选取 TClientdataSet 和 tdataSetProvider 两个组件。您必须(使用 DataSet 属性)将 tdataSetProvider 连接到 TSQLTable 组件,tdataSetProvider 将会为 TClientdataSet 提供记录。对于这最后一步,请确保将 TClientdataSet 的 ProviderName 属性指向 tdataSetProvider。

现 在,当应用程序打开 TClientdataSet 时,它将向 tdataSetProvider 发送一个数据请求。tdataSetProvider 组件接下来将打开 TSQLTable 组件,然后(通过到 DB2 数据库的 TSQLConnection)从 DB2 employee 表检索记录。

要显示 employee 表的内容,您需要向您的应用程序中添加另外两个(或三个)组件。第一个组件是 tdataSource 组件(也来自 Data Access 选项卡)。tdataSource 组件充当 TClientdataSet 与 Delphi 中任何所谓的识别数据的组件(都可以在 Component Palette 的 Data Controls 选项卡上找到)之间的“关口”。将 tdataSource 的 DataSet 属性指向 TClientdataSet。然后,在窗体中放入 tdBGrid 和 tdBNavigator 组件,将其 DataSource 属性指向 tdataSource 组件。

最后,当您将 TClientdataSet 的 Active 属性设置为 True时,您将在设计时得到实时 DB2 数据(请参阅 图 2)。


图 2. Delphi 7 在设计时与 DB2 通信。
Delphi 7 在设计时显示 DB2 数据

将更新应用到 DB2 表

现在,您可以编译并运行该应用程序来在运行时显示数据。(如果您没有将 TSQLConnection 组件的 LoginPrompt 设置为 False, 那么在看到数据之前您可能会看到登录对话框。)在该应用程序运行期间,您可能希望对表格中的数据做一些更改,并希望在从表格中的一条记录移动到另一条记录 时,这些更改能够被自动提交给底层数据集(这里是 TClientdataSet)。但是,当您关闭该应用程序然后重新启动它时,您将发现并没有对 DB2 数据库应用任何更改;而只是对本地內存中的 TClientdataSet 进行了更改,现在这些更改都已丢失。要显式地将更新应用到 DB2 数据库表,应用程序必须调用 TClientdataSet 的 ApplyUpdates 方法。当用户关闭应用程序时,这个方法能够在窗体的 OnClose 事件处理程序中自动完成:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if ClientdataSet1.ChangeCount > 0 then
ClientdataSet1.ApplyUpdates(0)
end;

注:ChangeCount 属性返回当前对内存中的 TClientdataSet 所做修改的数目,这些修改将被应用到 DB2 数据库。

由于全部修改一直保存在内存中,直到应用这些更新为止,因此为客户提供一个 Undo按钮是个不错的主意(根据我的经验,这常常会受到好评)。TClientdataSet 使用 UndoLastChange 方法支持 Undo,该方法的唯一一个参数指定是否希望应用程序执行这一修改(例如,如果您想将游标定位在刚刚执行撤销操作的记录上)。

要实现此方法,请(从 Standard 选项卡)在窗体中放入一个 TButton 组件,命名为 btnUndo,将其 Caption 设置为 Undo,然后将下面的代码添加到组件的 OnClick 事件处理程序:

操作和查询数据

除 TSQLTable 组件之外,您还可以使用 TSQLStoredProc 或 TSQLQuery 组件。前一个组件可以用来执行存储过程,后一个组件则可以用来执行 SQL 查询。

对 于 TSQLQuery 组件,您也要将其 Connection 属性指向 TSQLConnection 组件,然后在 SQL 属性中编写查询。遗憾的是,如果您想编辑该属性,您只能使用字符串列表编辑器,而没有构建查询的支持(例如,向您显示一些可用的表和字段名)。

尽 管 TSQLTable、TSQLStoredProc 和 TSQLQuery 都只有一个特定用途,但 TSQLDataSet 却象只变色龙。它可以执行这三种任务,并可以在运行时切换到所希望执行的行为。实际的行为通过两个属性(CommandType 和 CommandText)来定义。可以将 CommandType 属性设置为 ctQuery、ctStoredProc 或 ctTable,CommandText 属性将根据您做出的选择显示一个 SQL 查询构建器(SQL Query builder),它是一个表名称的下拉列表或存储过程名称的下拉列表。SQL 查询构建器是新出现的,因为它不是 TSQLQuery 组件本身的一部分。 图 3显示了在 department 表上构建查询的示例。


图 3. SQL CommandText Editor。
SQL CommandText Editor

因为增加了灵活性(以及添加了设计时 SQL CommandText Editor),所以我总是更喜欢使用 TSQLDataSet 组件,而从来不使用 TSQLTable、TSQLQuery 或 TSQLStoredProc 组件。

Component Palette 的 dbExpress 选项卡上的最后一个数据集组件是 TSimpleDataSet。这个组件是 Delphi 7 Studio 中新出现的,它替代了 Delphi 6 和 Kylix 中的 TSQLClientdataSet 组件。当您想创建并测试到 dbExpress 数据库的快速但不恰当的方式获得的连接时,您可以使用 TSimpleDataSet(以前是 TSQLClientdataSet),而不必使用 TSQLDataSet - tdataSetProvider - TClientdataSet 这“三驾马车”。TSimpleDataSet 集这三种组件的功能于一身。

要查看该组件 是如何工作的,请在窗体中放入一个 TSimpleDataSet 组件,然后将其 Connection 属性设置为 SQLConnection1。您现在可以使用嵌入的 DataSet 属性来指定要使用的表、查询或存储过程的名称。如果您在 Object Inspector 上双击 DataSet 属性,那么它会打开,并向您显示其子属性,就象前面在 TSQLDataSet 组件中所看到的 CommandType 和 CommandText 一样。将 CommandType 设置为 ctTable,然后再一次在 CommandText 属性中选择 employee 表。现在,您可以直接将 tdataSource 组件连接到这个 TSimpleDataSet,因为已经将 tdataSetProvider 和 TClientdataSet 嵌入到了 TSimpleDataSet 中。使用起来很方便,但我们只推荐将其用于简单用途。真正的现实世界应用程序则应该依靠 TSQLDataSet、tdataSetProvider 和 TClientdataSet 的组合。

监视性能

有时候,您想要跟踪客户机应用程序和 DB2 数据库之间发生的事情。TSQLConnection 组件可以将 dbExpress 跟踪消息发送给 TSQLMonitor 组件,这样一来后者就可以监控应用程序和数据库之间发生的事情了。

要设置监控,请在窗体中放入 TSQLMonitor 组件,将其 Connection 属性指向您想跟踪的 TSQLConnection 组件。指定将包含日志文件的文件名(如 c:\\db2.log ),然后将 AutoSave 属性设置为 True以确保应用程序关闭时(或释放 TSQLMonitor 时)在该文件中自动生成了日志文件。可以用其 Active 属性触发 TSQLMonitor 组件,因为只有在将 Active 设置为 True的时候,才会写跟踪消息。要获得更多过滤某些跟踪类别的灵活性和能力,您可以使用 OnTrace 和 OnLogTrace 事件处理程序。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15664650/viewspace-442312/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/15664650/viewspace-442312/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值