中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> IBM专区 > DB2 > .NET technology
访问 DB2 Universal Database 表
作者:佚名 时间:2005-09-08 19:23 出处:互连网 责编:小渔
              摘要:用 Delphi for .NET 访问 DB2 Universal Database 表
Bob Swart
顾问, Bob Swart Training & Consultancy
2004 年 3 月
Bob Swart 展示了如何使用 Borland Delphi 8 for the Microsoft .NET Framework 来构建本机 .NET 应用程序,该应用程序要连接 IBM DB2 UDB 表,在 DataGrid 中显示数据,以及编辑、应用或撤销数据表中所作的更改。

简介
本文中,我将演示如何使用 Borland® Delphi TM8 for the Microsoft .NET Framework(从现在开始缩写为“Delphi for .NET”)构建本机 .NET 应用程序,该应用程序要连接 IBM DB2 Universal Database TM(UDB)表,在DataGrid 中显示数据,以及编辑、应用和撤销在这些数据库表中所作的更改。至于数据访问技术,我将使用 dbExpress(跨平台的数据访问框架)和新的 Borland Data Provider for ADO.NET,其中均包含有对 DB2 UDB 的驱动程序。

使用 dbExpress 进行连接
上次,我介绍了从 Borland 数据库引擎(Borland Database Engine,BDE)的 SQL Links 数据访问层到 Borland 新的跨平台的 dbExpress 数据访问框架(与 Linux 上的 Kylix 和 Windows 上的 Delphi 都兼容)的迁移。这次,我将演示用 Delphi for .NET 来编译和运行同样的 dbExpress 应用程序 —— 作为本机 .NET 应用程序。

您可以拿现有的使用 DB2 的 Delphi 7 dbExpress 应用程序,或者构建一个新的(例如用 Delphi 7)并使用 Delphi for .NET 将之迁移到 .NET。让我们使用 Delphi 7 Enterprise 快速构建一个新的应用程序。

启动 Delphi 并且创建新的应用程序。从 Component PalettedbExpress选项卡上放入一个 TSQLConnection组件。右击该组件来启动 Connections Editor并确保填入正确的设置值,以便连接 DB2 UDB SAMPLE 数据库表(我的设置见图 1)。

图 1. dbExpress Connections Editor
dbExpress Connections Editor

关闭 Connections Editor并且将 TSQLConnection组件的 LoginPrompt 属性设置为 False

现在,放入 TSQLDataSet组件并使其 SQLConnection属性指向 TSQLConnection组件。然后,单击 CommandText的...并使用 Query Editor(也称为 CommandText Editor)写入下列 SQL 语句:


            SELECT * FROM EMPLOYEE
            

图 2. dbExpress CommandText Editor
dbExpress CommandText Editor

接下来,放入 TDataSetProvider组件并使其 DataSet属性指向 TSQLDataSet组件。放入 TClientDataSet组件并使其 ProviderName属性指向 TDataSetProvider组件。最后,放入 TDataSource组件并使其 DataSet属性指向 TClientDataSet组件。

现在可以放入数据感知控件,如 TDBGrid 组件。确保其 DataSource 属性指向的是 TDataSource 组件。如果打开 ClientDataSet(通过将 Active属性设置为 True),您现在就可以获得设计时的实时数据了:

图 3. 设计时 Delphi 7 中的 dbExpress
设计时 Delphi 7 中的 dbExpress

为了确保终端用户在 DBGrid 中可进行的更改能够回送给 DB2 UDB SAMPLE 数据库表,您需要在 OnAfterPostOnAfterDelete事件处理程序中编写一行代码:


            procedure TForm1.ClientDataSet1AfterPostOrDelete(DataSet: TDataSet);
            begin
            (DataSet as TClientDataSet).ApplyUpdates(0)
            end;

现在,您就可以编译并运行应用程序了。它将按预期效果进行工作。

dbExpress 和 Delphi for .NET
现在是时候使用 Delphi for .NET 打开工程了(本例中,是在不同的机器上进行,未使用 XP 桌面主题来展示差异)。

用 Delphi for .NET 打开工程,并按 F9,以便将之重新编译为本机 .NET 可执行程序。不会出现任何错误或者警告,并且结果工程也会完全按照 Win32 原型运行:

图 4. 作为本机 .NET 应用程序编译的 dbExpress
作为本机 .NET 应用程序编译的 dbExpress

请注意,虽然我已经通过在 OnCreate事件处理程序中使用下列代码确保其标题提及 Delphi for .NET,但应用程序还是保留了原始的 Delphi 7 图标(在窗体的左上角):


            procedure TForm1.FormCreate(Sender: TObject);
            begin
            {$IFDEF VER150}
            Caption := 'Delphi 7 using dbExpress to work with DB2 UDB'
            {$ELSE}
            Caption := 'Delphi for .NET using dbExpress to work with DB2 UDB'
            {$ENDIF}
            end;

本例还展示如何将连接到 DB2 的 Delphi 7 dbExpress 应用程序迁移到 Delphi for .NET,从而在 .NET Framework 上产生通过 dbExpress(以及 VCL for .NET)使用 DB2 UDB 的本机 .NET 应用程序。

其中,dbExpress 是跨平台的解决方案(在 Linux 上也可获得),现在,让我们检验仅用于 .NET Framework 连接 DB2 UDB 的方案:Borland Data Provider for ADO.NET。

使用 Borland Data Provider 进行连接
2003 年年初,我曾描述 Borland Data Provider 是如何扩展 ADO.NET 数据访问架构的(在关于通过 C#Builder 连接并且使用 DB2 数据库的两篇文章中: Working With DB2 Universal Database Tables Using C#Builder With ADO.NET and BDP for .NET和 利用用于 Microsoft .NET Framework 的 Borland 数据提供程序将 Borland C#Builder 连接到 DB2 UDB)。

这次,我将联合使用 Borland Data Provider for ADO.NET 和 Delphi for .NET,来构建本机 WinForm 应用程序。启动 Delphi for .NET 并创建新工程。

图 5. Delphi for .NET 的 WinForm 应用程序
Delphi for .NET 的 WinForm 应用程序

在 Delphi for .NET IDE 的右上角,单击 Data Explorer选项卡,上面显示了 Borland Data Provider for ADO.NET 的清单(带有对 DB2 和其他数据库管理系统的驱动程序)。如果打开 DB2 节点,您可以右击 DB2Conn1连接节点并且右击以编辑其连接属性。

图 6. BDP Connections Editor
BDP Connections Editor

本例中,您需要为 DB21Conn1 指定 SAMPLE 为数据库,并且指定正确的用户名和口令以连接该 DB2 UDB 数据库。可以单击 Test按钮来验证连接是否建立成功。如果连接正确,您就可以打开 DB2Conn1 节点,并查看 DB2 SAMPLE 数据库中的表、视图或(存储)过程,如图 7 所示。

图 7. 显示 DB2 SAMPLE 表的 Data Explorer
显示 DB2 SAMPLE 表的 Data Explorer

现在,为了创建使用 EMPLOYEE 表的应用程序,您只要将 ADMINISTRATOR.EMPLOYEE节点从 Data Explorer拖到 WinForm设计器区域。

然后,Delphi 将创建两个非可视的组件(见稍后的图 13):BdpConnection 和 BdpDataAdapter 组件。它们是 Borland Data Provider for ADO.NET 的组成部分。BdpConnection 组件负责连接 DB2 UDB SAMPLE 数据库,而 BdpDataAdapter 组件则通过 SELECT、UPDATE、DELETE 和 INSERT 命令(如马上将看到的,由 BdpCommand 类表示这些命令),充当 .NET DataSet 和数据库本身之间的“适配器”。

BdpConnection 组件已经配置完毕,且无须进一步关注。然而,您也许希望检查 BdpDataAdapter 组件的设置值,因此选择该组件。在 Object Inspector 的下面部分,您将看到两个特别的动词(链接),一个用于构建类型化 Dataset,而另一个则是配置该 DataAdapter。

单击 Configure the DataAdapter以启动 Data Adapter Configuration对话框(见图 8)。

图 8. Data Adapter Configuration - Command
Data Adapter Configuration - Command

与 dbExpress CommandText Editor 一样,您可以在这里选择用以构建自己的 SELECT 命令的表和字段。然而,Borland Data Provider 还支持自动生成 UPDATE、INSERT 和 DELETE 命令。如果要更改表或字段名,您可以单击 Generate SQL 按钮来重新生成正确的 SQL 命令。

请注意,Optimize 选项将影响 UPDATE 和 DELETE 命令的 WHERE 子句,以确保这些 WHERE 子句中仅使用主键字段。该选项可以产生更快的 UPDATE 和 DELETE 语句(其选择仅仅基于主键),但是此便利将带来潜在的代价:如果某人已经更改了您需要更新的记录并且更改是在非关键字段中进行的,那么,UPDATE 语句将无法识别出此特定记录已经被另一用户更改。这对于您或许没问题,但至少要意识到该副作用,所以要小心使用 Optimize!

顺便说一句,如果对 DB2 UDB SAMPLE 表启用 Optimize,并单击 Generate SQL 按钮,那么将出现下列错误消息:Automatic SQL statement generation requires a primary key(见图 9)。

图 9. Generate SQL 错误消息
Generate SQL 错误消息

为了修复该错误,要么重新构建 DB2 UDB SAMPLE 数据库的 EMPLOYEE 表,要么取消 Optimize 选项并且重新生成正确的 SQL。请注意这次,Data Adapter Configuration 对话框将显式地列出所有字段(将图 10 与图 8 相比较),而不仅仅列出 SELECT * FROM ADMINISTRATOR.EMPLOYEE。

图 10. Data Adapter Configuration - 新的 SQL
Data Adapter Configuration - 新的 SQL

您一旦满意 SELECT 语句(其他 SQL 命令也如此),就可以单击 DataSet选项卡(见图 11)来选择或者创建 .NET DataSet 了,而该数据集应该保存 SELECT 语句的结果,并且将包含可更新、插入或删除的数据。

图 11. Data Adapter Configuration - DataSet
Data Adapter Configuration - DataSet

.NET DataSet 组件可以包含多个表或查询结果,因此可以选择现有的 DataSet(这次没有一个数据集),或者创建一个新的并且起一个合理的名字。

下个步骤涉及指向 Preview Data选项卡和 SELECT语句结果的预览。默认情况下,输出限于 100 条记录,但是,您当然可以修改该数字。

图 12. Data Adapter Configuration - Preview Data
Data Adapter Configuration - Preview Data

现在,关闭 Data Adapter Configuration对话框,并返回 Delphi for .NET。WebForm 设计器的非可视组件区域现在有三个组件:BdpConnection、BdpDataAdapter 和 DataSet。

当通过将其 Active 属性设置为 True 而激活 BdpDataAdapter 组件时,您可以在 .NET DataSet 里显式地创建新表。

使用 DB2 数据
为了显示该表的内容,您可以在窗体上放入 DataGrid组件。将其 DataSource属性设置为 DataSet以及 DataMember属性设置为 Table1。它将立即显示设计时的实时数据,如图 13 所示。

您在图 13 中还将注意到三个按钮(btnUndo、btnUpdate 和 btnClose),标题分别为 UndoUpdateClose。前两个按钮将让终端用户选择要么撤销在 DataGrid 中所做的更改,要么将之应用到 DB2 UDB SAMPLE 数据库。

图 13. 带有设计时的“实时”数据的 Delphi for .NET IDE
带有设计时的“实时”数据的 Delphi for .NET IDE

第一个单击事件处理程序是针对 Undo 按钮的,十分容易,并简单地称之为 DataSet1.RejectChanges 方法。第二个单击事件处理程序是针对 Update 按钮的,由对 BdpDataAdapter 的 AutoUpdate 方法的调用构成。调用 AutoUpdate 时,您可以不带参数,也可以指定数据集、表名、更新模式和其他选项。本例中,将 Table1 作为表名在 DataSet1 上调用 AutoUpdate 方法。可以将 BdpUpdateMode.Key 或 BdpUpdateMode.All 作为 UpdateMode 传递,这应该会让您有点想起 BdpDataAdapter Configuration 对话框中的 Optimize 选项。实际上,使用 BdpUpdateMode.Key 将生成在 WHERE 子句中仅使用表的主键的 SQL update 语句,而 BdpUpdateMode.All 在 WHERE 子句中将使用所有字段。由于 DB2 UDB SAMPLE 数据库中的 EMPLOYEE 表没有主键,所以应该使用 BdpUpdateMode.All(无论如何,我大概更愿意使用它)。这些事件处理程序的源代码如下所示:


            procedure TWinForm.BtnClose_Click(sender: System.Object; e: System.EventArgs);
            begin
            Close
            end;
            procedure TWinForm.BtnUpdate_Click(sender: System.Object; e: System.EventArgs);
            begin
            if dataSet1.HasChanges then
            BdpDataAdapter1.AutoUpdate(dataSet1, 'Table1', BdpUpdateMode.All, [], []);
            BtnUpdate.Enabled := dataSet1.HasChanges;
            BtnUndo.Enabled := dataSet1.HasChanges
            end;
            procedure TWinForm.BtnUndo_Click(sender: System.Object; e: System.EventArgs);
            begin
            if dataSet1.HasChanges then dataSet1.RejectChanges;
            BtnUpdate.Enabled := dataSet1.HasChanges;
            BtnUndo.Enabled := dataSet1.HasChanges
            end;

请注意,BtnUpdate_Click 和 BtnUndo_Click 事件处理程序都使用 dataSet1.HasChanges 属性来启用或者禁用 BtnUpdate 和 BtnUndo 按钮(如果 RejectChanges 或 AutoUpdate 正确工作,那么,这两个按钮在事件处理程序的末尾都将被禁用)。

需要做的最后一件事就是,确保在更改 DataGrid 中的数据时启用这两个按钮。为此,您需要关联 DataTable 的 RowChanged事件处理程序,并写入以下两行代码:


            procedure TWinForm.DataTable1_RowChanged(sender: System.Object;
            e: System.Data.DataRowChangeEventArgs);
            begin
            BtnUpdate.Enabled := dataSet1.HasChanges;
            BtnUndo.Enabled := dataSet1.HasChanges
            end;

现在就保存所做的工作并且编译工程。运行该应用程序的时候,它会连接到 DB2 UDB SAMPLE 数据库并在 DataGrid 中显示 EMPLOYEE 表。

图 14. 向 DataSet 提交更改之前
向 DataSet 提交更改之前

您可以更改 DataGrid 中的数据。当您提交网格(grid)中的数据时(通过从一行移到另一行完成),将激活 RowChanged 事件处理程序,这将启用 Undo 和 Update 按钮,如图 15 所示。

图 15. 进行了更改:Undo 或 Update?
进行了更改:Undo 或 Update?

请注意,如果您没有单击 Update 按钮就关闭了应用程序,那么在真正的 DB2 SAMPLE 数据库中不会保存所做的更改。因此,您可以考虑在 Close 事件处理程序中为 DataSet1.HasChanges 添加最后的检查(但是,我将其留给您自己练习)。

部署 BDP 应用程序
Borland Data Provider 包含由一个强键码标志的程序集,并且最好部署在 Global Assembly Cache(GAC)中。具体地说,您需要部署 Borland.Data.Provider.dllBorland.Data.Common.dllBorland.Data.Db2.dll ,并且还需要确保可以找到 bdpdb2.dll Win32 DLL ,因为它将链接 db2cli.dll 中的 DB2 客户机。

三个 Borland.Data 程序集既可以作为可执行程序放置在同一目录下(因而,只有您的客户机应用程序可以看到并使用它们),也可以通过 gacutil 命令行工具部署在 Global Assembly Cache 中。后一种情况下,它们将在您的 .NET 机器上被共享,因而也可以被其他的 .NET 应用程序使用。

结束语
本文中,我展示了 DB2 UDB 是一个功能强大的 DBMS,可被 Delphi for .NET 以两种不同的方式使用,既可以通过 dbExpress 跨平台组件(与 Windows 上的 Delphi 7 和 Linux 上的 Kylix 都兼容),也可以通过本机 Borland Data Provider for ADO.NET 加以使用。

Borland RAD 工具和 DB2 UDB 可在 .NET、本机 Win32 和 Linux 上进行连接,并且在所有情况下,Borland 工具都提供一个直接且优化了的连接以使用 DB2 表。

下次,我将探讨 DB2 UDB 表在用 Delphi for .NET 构建的 ASP.NET Web Form 应用程序中的使用。

关于作者
Bob Swart(也称为 Dr.Bob - www.drbob42.com)在他自己的公司 Bob Swart Training & Consultancy(eBob42)(位于荷兰 Helmond)的身份是作家、教员、顾问和 Web 管理员。Bob 编写了自己的 Delphi 培训教材,并且从 1993 年以来一直在 Delphi 和 Borland 开发者大会上发表演讲。Bob 已经撰写了数百篇文章,并且还是 Revolutionary Guide to Delphi 2Delphi 4 UnleashedC++Builder 4 UnleashedC++Builder 5 Developer's GuideKylix Developer's GuideDelphi 6 Developer's GuideC++Builder 6 Developer's Guide的合著者。
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有