在 本文中,我将演示如何将 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 带有多种数据访问库,如 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 属性。

一旦设置好了一切,就请关闭 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 通信。

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