分享
 
 
 

将 DB2 数据库应用程序转移到 ADO.NET

王朝厨房·作者佚名  2007-01-04
窄屏简体版  字體: |||超大  

中国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 数据库应用程序转移到 ADO.NET

作者:佚名 时间:2005-09-09 15:22 出处:互连网 责编:小渔

摘要:利用 Delphi 8 for .NET 将 DB2 数据库应用程序转移到 ADO.NET

Jeremy McGee

顾问

2004 年 5 月

Borland Delphi 8 for the Microsoft .NET Framework 首次为 Delphi 应用程序引入了 ADO.NET 数据库架构。本文概要地介绍了 ADO.NET 的不同之处并且解释了如何在现有的 Delphi VCL 应用程序中通过 .NET 来使用它。

简介

Borland® Delphi TM8 for the Microsoft® .NET Framework(从现在开始称作 Delphi 8 for .NET)引入了一种使用数据库的新方法。如果您过去使用过 Delphi 或者 Kylix,那么您将熟悉 Borland Database Engine 或 dbExpress 及其组件。然而,Microsoft® .NET Framework 却带来了不同的数据库引擎 —— Microsoft ADO.NET 库。

首先,我将介绍 ADO.NET 给 Delphi 开发人员带来了什么,然后将概要地介绍 ADO.NET 中的不同组件是如何共同工作的。最后,我将探索如何在现有的 Delphi VCL 代码中使用 ADO.NET。

IBM DeveloperWorks 上的其他几篇文章说明了如何在 Delphi 8 中使用 ADO.NET 来访问 IBM® DB2® Universal Database TM(UDB)数据。这些文章包括 用 Delphi for .NET 访问 DB2 Universal Database 表(该软件使用 .NET Windows Forms 来处理 ADO.NET 数据)和 使用 Delphi for .NET 处理 ASP.NET Web 页面上的 DB2 数据库表,说明如何使用 Delphi 来创建要通过 ADO.NET 使用 DB2 的 ASP.NET Web 应用程序)。

Delphi 8 for .NET 体系结构

Delphi 8 for .NET 具有两个分支。两者都使用源于 Pascal 的 Delphi 语言并共享相同的 IDE。然而,一个使用 Visual Component Library 来创建应用程序;而另一个分支则是使用 Microsoft .NET 开发方法来创建 Windows Forms(或 WinForms)和 ASP.NET 应用程序。

在使用 Windows Forms 时,很可能要通过 Delphi 表单设计器来用图形连接 ADO.NET 组件,这与针对 BDE 和 dbExpress 的 VCL 组件所用方式几乎完全相同。(关于如何做到这一点的例子,请参阅 Bob Swart 的文章 用 Delphi for .NET 访问 DB2 Universal Database 表。)

然而,VCL Forms 应用程序无法直观地使用 ADO.NET 组件。必须通过程序代码来创建和使用 ADO.NET 组件。本文中,我将向您展示如何通过 Delphi 程序代码来使用 ADO.NET。

VCL 和 Windows Forms 应用程序恰好都适合使用程序代码。由于像 Borland C#Builder® 一样,Delphi 8 for .NET Windows Forms 应用程序也不具有数据模块,所以如果需要集中进行数据库检索,您就需要使用程序代码。

为何要更改?

首先必须回答的问题就是:究竟为何要使用 ADO.NET?

dbExpress 在 .NET 中继续受到了 Borland 的支持,但它使用的是一个非托管的 DB2 驱动程序。这很可能会降低应用程序性能并可能使系统产生安全问题。

ADO.NET 是 .NET Framework 的组成部分并且是百分之百的 .NET 托管代码。这是 Visual Studio .NET 所使用的数据库驱动程序技术,所以几乎每个数据库销售商都支持 ADO.NET:如果驱动程序能用于 Visual Studio .NET,那么就能用于 Delphi 8 for .NET。

这还意味着存在一个大型的(且不断增长的)关于 ADO.NET 以及如何使用它的知识库。这些知识直接适用于 Delphi 程序。

最后,Borland 还为 ADO.NET 引入了最后一点好处。Borland Data Provider(BDP)支持构造使用任何一种主数据库服务器的 .NET 应用程序,且无需重新编译或部署额外的驱动程序。这对于 OEM 或 VAR 特别有用,因为它们希望为众多客户机构造单一版本的应用程序。

在 VCL 应用程序中使用 ADO.NET

正如我所提到的,VCL 应用程序不能直接使用 .NET Framework 组件 —— 必须使用程序代码来创建它们。虽然这也许感觉有些受限制,但是程序代码并不难且相当容易理解和维护。

这意味着您将需要编写一些程序代码来在应用程序中创建 ADO.NET 组件。我将概述创建到 DB2 数据库的典型连接以及执行简单查询所要采取的步骤。然后,您将使用该查询来填充表单上常规的 VCL DBGrid。

通过代码使用 ADO.NET

下面是对照 BDE 的 ADO.NET 的简化结构视图。

图 1. 将 ADO.NET 与 使用 BDE 的 VCL 组件进行比较

总之,DBConnection 组件先链接数据库,然后 DBCommand 和 DBDataReader 在数据库上执行查询。而 DataSet 组件(包含 DataTables 和 DataColumns)则使用 DBDataReader 来填充缓存的本地数据集,而该数据集接着就由 Windows Forms 组件来显示和修改。

由 Microsoft 提供的 DBConnection、DBCommand 和 DBDataReader 都是抽象接口,而非真正的具体类。Microsoft 为不同类型的服务器提供了托管的数据库提供程序,例如用于 Microsoft SQL Server 的 SqlDBConnection、SqlDBCommand 和 SqlDBDataReader。IBM 也提供了一个带有 DB2Connection、DB2Command 和 DB2DataReader 的托管提供程序。

虽然这样可能实现在数据提供程序中使得每个数据库都可用的专用化功能,但该方法的不利之处就是将您的代码绑定到了特定的服务器。

Borland 通过 BDP 帮助您免受该限制。BDP 是由一组可访问许多不同数据库服务器的类 —— BdpConnection、BdpCommand、BdpDataReader,等等。代码中惟一需要修改的就是在代码第一次实例化时传递给 BdpConnection 组件的‘连接字符串’。

关于更多从 C# 和 Borland C#Builder 的视角查看 ADO.NET 内部工作的细节,请参阅 从 BDE 和 dbExpress 转移到 ADO.NET。该论文比此处更加详细地描述了 BDP 的内部工作情况。

设置 Delphi 应用程序以使用 ADO.NET

在 Windows Forms 应用程序中,可使用表单设计器中的 Tool Palette 来向 Delphi 8 for .NET 应用程序添加 ADO.NET 组件。正如您所预期的,Delphi 将向程序中的 uses 子句自动地添加相关引用。

如果您是从应用程序中通过代码来使用 ADO.NET,那么需要告诉程序使用一些附加的 .NET 程序集。这些程序集正是数据库驱动程序和 ADO.NET 组件的位置所在。

首先,创建一个新的 VCL Forms空应用程序,将其编译并保存。

下一步就是向程序添加 BDP 程序集。在 Project Manager中,展开项目的 References选项卡来查看当前列表。对于一个简单的 VCL 应用程序,看上去将如下图所示:

图 2. 空 VCL 应用程序的默认引用

右击叶子 References并选择 Add Reference。然后,您的系统将会暂停一下,因为它要检查 Global Assembly Cache 中的所有程序集。

您将需要的两个引用是 Borland.Data.Provider 和 Borland.Data.Common。依次选择它们并将之添加到列表尾部。

当添加完这两个程序集之后,就关闭对话框。现在,您就可以像使用常规 Delphi 单元(unit)一样引用程序集了 —— 只要在应用程序的 uses 子句中添加整个程序集名。例如,要使用 BDP 托管的提供程序,就添加

uses Borland.Data.Provider, Borland.Data.Common;

到您的应用程序中。

设置 Delphi 以在 ADO.NET 与 VCL 之间架起桥梁

如果您需要在 VCL Forms 应用程序中使用 ADO.NET,那么您还需要来看最后一个设置步骤,即在工具面板(tool palette)中加载 TADONETConnector 组件。这需要一个设计时程序包,而不是已包括在项目中的运行时程序包。

选择 Components | Installed .NET Components。该对话框的 .NET VCL Components选项卡将显示设计时 .NET 程序集,该程序集包含了您正在 Delphi 中使用的 VCL 组件。

在我的 PC 上,默认情况是 ADO.NET Connector 未包括在该列表中,因为它包含在它自己的设计时程序集中。选择 Add并浏览

C:\\Program Files\\Borland\\BDS\\2.0\\Bin\\Borland.Vcl.Design.AdoNet.dll

(不要添加共享程序集中的 Borland.VclAdoNet.dll —— 这仅是一个运行时程序包。)

关闭对话框。现在当您处于设计模式时,您将看到该组件出现在 Data Access 类别的 Tool Palette 中。

利用 DBConnection 进行连接

现在,您应该都设置完毕并且准备好在应用程序中创建 ADO.NET 组件了。

我建议您首先创建一个 DataModule 并且在其中放置 ADO.NET 代码。这里集中了数据库的访问逻辑。因此,先选择 File | New | Data Module,然后切换到代码单元。

第一步就是创建一个小函数,用以连接 DB2 数据库并且运行查询。然后,我们将使该数据可用于应用程序主表单上的数据感知的 VCL 组件中。

首先再进行一些内务处理,以便您可以在该单元(unit)中使用 ADO.NET 组件。在该单元顶部的 uses 子句中添加 Borland.Data.Provider、 Borland.Data.Common 和 System.Data。

然后,您将创建 BdpConnection 对象,它将用作实际从数据库检索数据的所有其他 BDP 对象的“句柄”。它负责身份验证和会话管理,有点像 BDE 的 TDatabase 和 TSession 组件。

将私有声明

myConn: BdpConnection;

添加到类声明中(在注释 {Private declarations}下),然后将一个公共的前向过程声明

procedure Connect;

添加到注释 {Public declarations}下,因为您需要在主表单上调用该过程。

然后,您就可以在实现程序块中添加过程本身的主体了。您可以从简单的开始进行。

procedure TDataModule2.Connect;

begin

// Open the connection

myConn:=BdpConnection.Create(’database=SAMPLE;assembly=Borl

and.Data.Db2,Version=1.5.0.0,Culture=neutral,’+

’PublicKeyToken=91d62ebb5b0d1b1b;vendorclient=db2cli.dll;provider=DB2;’+

’username=<uname>;password=<pwd>’);

end;

您需要用 DB2 实例的用户名和口令来替换其中的 <uname> 和 <pwd>。

这些工作属于创建 BdpConnection 对象和用连接字符串来连接标准的 DB2 SAMPLE 数据库。但是,不像对于其他 ADO 数据提供程序,您还需要在后来修改连接以指向另一数据库,您只需要修改该连接。

BdpConnection 类与 BDE TDatabase 或 dbExpress TSQLConnection 组件大致相当。与这些组件一样,BdpConnection 是管理事务的地方。不过事务管理的方法却很不同:BdpConnection 类的 BeginTransaction 方法返回一个事务对象,这个对象可用作后面的 SQL 命令的一个属性。

检索数据

建立连接后,我们就可以开始从 DB2 数据库检索数据了。

ADO.NET 使用 DataSet 组件来充当本地数据存储器。它有一点类似 Delphi TClientDataSet,因为该组件保存的是数据库数据的缓存副本并且使之用于数据感知控件。

不像 TClientDataSet 仅仅管理单个的表,DataSet 组件可以同时缓存许多表。而每个表又包含多个列。ADO.NET 为这些表定义了 DataTable 对象,每个 DataTable 包含一个或多个 DataColumns。

要填充 DataSet,您需要数据提供程序中的 DBCommand 对象 —— 本例中为 BdpCommand 对象。该对象运行服务器上的 SQL 查询。

该查询的结果可通过 BdpDataAdpater 组件连接到 DataSet。该组件自动在 BdpCommand 中执行查询并且将数据置于 DataSet 中的 DataTable 中。

这在程序代码中可能更易于解释。在 DataModule 单元的 {Private declarations}部分中添加下列对象名:

dsStaff: DataSet;

tabStaff: DataTable;

colID, colName, colYears: DataColumn;

commSel: BdpCommand;

daStaff: BdpDataAdapter;

然后在 Connect 过程中添加下列内容:

// Create a new dataset

dsStaff := DataSet.Create(’DSStaff’);

// Set up the columns for the table for the dataset

colID := DataColumn.Create(’ID’);

colName := DataColumn.Create(’NAME’);

colYears := DataColumn.Create(’YEARS’);

// Set up the table for the dataset and add the columns

tabStaff := DataTable.Create(’TabStaff’);

tabStaff.Columns.AddRange([colID, colName, colYears]);

// Add the table to the dataset

dsStaff.Tables.AddRange([tabStaff]);

// Create a command object to retrieve data

commSel := BdpCommand.Create(’SELECT ID, NAME, YEARS FROM STAFF’,myConn);

// Create the data adapter

daStaff := BdpDataAdapter.Create;

// Point the data adapter to the command object to get data

daStaff.SelectCommand := commSel;

// Point the data adapter to the DataSet and the table within it

daStaff.DataSet:=dsStaff;

daStaff.DataTable:=tabStaff;

// Tell the DataAdapter to automatically populate the table

daStaff.Active:=True;

请注意我为 AddRange 方法所使用的语法。例如,C# 中等同的语法为:

tabStaff.Columns.AddRange(new DataColumn[] {colID, colName, colYears});

Delphi 从数组元素中推测出数组类型。

连接数据感知的 VCL组件

现在,您已经配置并且运行了 ADO.NET DataSet。最后一步就是将之连接到应用程序主表单上的网格(grid)。

完成该工作的组件就是 TADONETConnector。在 DataModule 中,切换到设计模式并且从 Tool Palette(您将在 Data Access部分找到它)添加一个 TADONETConnector。将其放到表单上。

TADONETConnector 的作用有点像用于从 DataSet 中的 DataTable 里取数据的 TTable。一旦将它放置在表单上,就可以用一个常规的 TDataSource 来检索其中的数据。

因此,在表单上放入一个 TDataSource 并且将其 DataSet 属性连接到 ADONETConnector1。然后切换到项目的主单元,选择 Design 视图并向表单添加 TDBGrid。关联 DataSource:在 File菜单中选择 Use Unit并选择 Unit2,然后选择 DBGrid 并将其 DataSource 属性设置为 DataModule1.DataSource1。

您接着需要添加代码,用以为 ADONETConnector1 从 DataSet 检索数据。切回到数据模块的代码中,然后在 Connect 过程中添加下列几行代码:

// Hook up the ADONetConnector

ADONetConnector1.DataTable:=tabStaff;

ADONetConnector1.Active:=True;

最后一步就是运行 Connect 过程以连接数据库、加载 DataSet,以及填充网格。切回到主表单,添加一个 TButton,将 Caption 设置为 Connect 并且在 Click 事件处理程序中添加一行代码:

DataModule2.Connect;

这就可以了!编译该应用程序并且运行它。(如果您碰到编译问题,请确保没忘记复制 DataSet、DataTable及其他组件的所有字段定义。还请记住在主表单和 DataModule 之间,您将需要 File | Use Unit。)

当运行应用程序时,您将首先看到一个空的网格。按下按钮进行连接后,您就会看到有数据出现在网格中。

图 3. 完成的应用程序

从 BDE 转移到 ADO.NET 和 BDP

下面简要地总结了在您习惯于 BDE 的情况下您所需要查看的组件。这里没有包括完全,当然是经过了简化的,但是它将有助您确定从哪里开始。

BDE 组件 功能 ADO.NET 组件 功能

TSession 和 TDataBase建立到数据的连接以及管理事务DB2Connection、BdpConnection建立到数据库的连接和管理事务

Ttable管理一个表的本地缓存没有直接的同等物。要么同时使用 DataSet 和 DbDataAdapter,要么同时使用 DbCommand 和 DataReaderDataSet 根据查询创建一个或多个表的本地缓存

Tquery管理一个查询的本地缓存没有直接的同等物。要么使用 DataSet / DbDataAdapter,要么使用 DbCommand / DataReaderDbCommand / DataReader 管理查询结果的前向游标

TstoredProc执行存储过程DbCommand能够执行存储过程,可选地返回一个结果集

结束语

我已经展示了在 VCL 应用程序中用 ADO.NET 取代 Borland Database Engine 并非很难。实质上,您需要添加代码以实例化一个或多个 DataSet 并且通过 BdpConnection 和 BdpCommand 对象来填充它们。然后,这些 DataSet 可通过 TADONETConnector 对象用于替换现有的 TTable 和 TQuery 对象。

ADO.NET 是一个功能丰富的、先进的数据库访问库。尽管 ADO.NET 与 Borland Database Engine 有很大的不同,但是 Borland Data Provider(BDP) 经过改进的特性使得它更易于使用。BDP 为需要访问 DB2 的 Windows 开发人员提供了一种高效且可伸缩的创建 Windows 客户机和 Web 应用程序的方法。

关于作者

Jeremy McGee是使用 dBASE III Plus 创建网络应用程序的始作俑者之一,当时还是 PC 时代的早期。从那以后,他使用过 Paradox、Delphi 和 Visual Studio。同时,他还是位于英国南安普顿市的一家咨询公司的董事。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有