中国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
C#Builder 处理 DB2 通用数据库表
作者:佚名 时间:2005-09-09 15:19 出处:互连网 责编:小渔
              摘要:使用带有 ADO.NET 和 BDP for .NET 的 C#Builder 处理 DB2 通用数据库表
Bob Swart
Bob Swart Training & Consultancy
2004 年 4 月
本文展示了如何可以通过 Borland Data Provider for .NET 来访问 DB2 UDB,通过许多设计时和运行时的支持(包括自动的(优化的)SQL 命令生成)增加了 ADO.NET 体验。在该环境中,DB2 UDB 证明是 .NET Framework 上功能强大的 DBMS。

简介
在 我的第一篇 有关与 Borland® C#Builder TM 一起使用 IBM DB2® Universal Database TM(UDB)的文章中,我展示了如何使用 Borland Data Provider(BDP)for .NET 来构建一个到 DB2 UDB v8.1 的连接以及如何使用 DB2 SAMPLE 表。这次,我将更详细地分析一些单个的 Borland Data Provider 类,尤其是设计时编辑器,并将其与通用的 ADO.NET 进行比较。

此外,在本文的结尾处,我将介绍一些用于结果 C#Builder 项目和 BDP 程序集的重要部署细节。

用 Borland Data Provider 扩展 ADO.NET
让我们从通用 ADO.NET 的连通性着手,它包含可在工具面板的 Data Components 类别中找到的五个类:SqlDataAdapter、SqlConnection、DataView、DataSet 和 SqlCommand。上次,我演示了三个 SQL 类(BdpDataAdapter、BdpConnection 和 BdpCommand)的 BDP 版本。每个 BDP 类都是派生于其 SQL 副本,并且用附加的设计时支持进行了扩展。

ADO.NET 的主要目的是为了提供公共类型系统、命名约定和设计模式,用以在 Microsoft® .NET Framework 中处理数据库。因此,ADO.NET 天生是在 .NET Framework 上连接 DB2 UDB 的方式。

ADO.NET Data Provider 是一组类的集合名,这些类实现到特定数据源(本例中当然为 DB2 UDB)的连接。该 Data Provider 还可以针对数据源执行命令,对于开发人员来说,无论是何种数据源,这些命令都以类似的方式进行工作。这意味着如果您当前有一个应用程序使用 ADO.NET 连接一个小型数据库,而该数据库缺乏较好的伸缩性(这对于多用户的 Web 应用程序特别成问题),那么您只需少许工作就可以改为采用 DB2 UDB 作为数据库引擎。而 ADO.NET 中的类及其使用实际上将是相同的。

SqlConnection 类负责连接 DBMS,而 SqlCommand 负责执行稍后用于填充 DataSet 类的 SQL 语句。SqlDataAdapter 类一方面充当 SqlConnection 和 SqlCommand 之间的适配器,另一方面则充当 DataSet,以允许 DataSet 断开与真正的 DBMS 的连接(如果您需要检索更多数据或应用更新,就只需要重新连接此处)。最后,DataView 是一个特殊的类,用以支持以不同的方式(排序的、筛选的,等等)查看 DataSet 中的数据。

Borland Data Provider 实现并扩展了 ADO.NET 数据提供程序类(特别是 SqlConnection、SqlDataAdapter 和 SqlCommand 这三个类)。实际上,C#Builder 中可获得许多不同的 Data Provider,包括为 DB2 UDBv7.1 和 v8.1 进行了优化的一个 Data Provider。这个特殊的 Borland Data Provider(BDP)将是用以连接和处理 DB2 UDB 表的最为有效的 ADO.NET Data Provider。

在本文中,我将向您展示更多 BDP 对于 DB2 设计时的支持,以及当处理 DB2 数据时的一些实际问题,最后则是一些部署信息。

指定新的 DB2 连接
启动一个新的 C#Builder 项目(一个常规的 C# 应用程序),然后进入 Data Explorer(位于左上角)。这将显示四个可能的提供程序(Provider):Borland InterBase®、Oracle®、DB2 和 Microsoft® SQL Server TM。右击 DB2并添加新的连接。称其为 SAMPLE,因为您将再次与 DB2 UDB SAMPLE 表进行对话。右击 SAMPLE 连接以修改该连接。

图 1. Connections Editor
图 1. Connections Editor

指定 Database 为 SAMPLE,并指定正确的用户名和口令以连接 DB2 数据库。或者,您可以将 LoginPrompt 设置为 true,这将使终端用户能够亲自指定用户名和口令。请注意,将该属性设置为 true 实际上将强制显示 Login Prompt 对话框,即使已指定的用户名和口令都是正确的。

请注意, VendorClient 指向的是 db2cli.dll —— DB2 UDB 客户机 DLL。该 DLL 必须安装在运行该应用程序的机器上,并且可在 C:\\Program Files\\IBM\\SQLLIB\\BIN 目录中找到。在成功安装了 DB2 UDB 之后(我的机器上安装了版本 8.1.0.36 和 DB2 UDB v8.1),该目录将包含在您的路径(PATH)中。

所指定的 程序集Borland.Data.Db2.dll ,该程序集包含特定于 DB2 的 ADO.NET Data Provider。请注意其版本号和以下事实:它是通过公钥标志的,以便您可以在 Global Assembly Cache(GAC)中部署该程序集。(我将在本文结尾处再回到该主题上。)

您可以将 Transaction Isolation 设置为 ReadCommitted(默认值)、RepeatableRead(锁定一个查询中使用的所有数据以避免不可重复的读)或 DirtyRead(不使用共享锁,也不支持排他锁)。ReadCommitted 意味着在读取数据时,要锁定数据以防止脏读(dirty read),但是数据可在事务结束前更改,从而产生不可重复读或幻像数据(phantom data)。

在您完成对连接属性的指定之后,就关闭该对话框。现在,您可以将 SAMPLE 连接拖入窗体,这将使得 BdpConnection 类被放置于设计器(designer)的非可视组件区域。

使用 BDP for .NET 访问数据
接下来,选择工具面板中的 Borland Data Provider 类别,并在窗体上放置 BdpDataAdapter 组件。这是特殊版本的 ADO.NET SqlDataAdapter,并且可用于生成 SQL 语句(用于 BdpCommand 类)来填充 DataSet 以及在稍后更新 DB2 表。为了配置 BdpDataAdapter,单击设计器(恰好位于 Object Inspector 下)左下角中的 Configure Data Adapter链接。

如果您已经将 LoginPrompt 属性设置为 true,那么您现在首先将看到登录对话框。请确保在这里指定一个有效的 DB2 用户名和口令来来连接 DB2 UDB SAMPLE 表。

图 2. 登录对话框
图 2. 登录对话框

在成功登录到 DB2 SAMPLE 数据库之后,将出现 Data Adapter Configuration 对话框。显然,BdpConnection 已经被指派为 Connection 类,而且您现在可以在左上角选择 EMPLOYEE 表和您所需要处理的字段(EMPNO、FIRSTNME、LASTNAME、WORKDEPT、PHONENO、HIREDATE、JOB、EDLEVEL、SEX 和 BIRTHDATE)。您不必编写任何 SQL,但现在可以单击 Generate SQL 按钮来为您所需的选中的 SQL 命令生成 SQL(默认情况下,选中了 Select、Insert、Update 和 Delete 选项,但是如果您只希望查看数据,或只修改现有记录,而不插入新的记录,那么您就应该取消那些不需要的选项。)

请注意 Optimize 选项,该选项可用于为 Update 和 Delete 语句创建更加高效的 SQL(即进行优化,以在这些 SQL 命令的 WHERE 子句中利用主键)。

图 3. Data Adapter Configuration 对话框
图 3. Data Adapter Configuration 对话框

对于本例,选择 EMPLOYEE表,并选择 *以表示所有列,仅选择 Select SQL Command,选中 Optimize复选框,并单击 Generate SQL 按钮以生成 Select查询,如图 2 所示。

请注意若表中不含主键,您就不能为 Update 和 Delete 语句生成优化的 SQL 命令(本例中,您必须生成和使用非优化的 SQL 命令)。您猜为何如此?在本例中,DB2 SAMPLE EMPLOYEE 表没有主键,尽管您可以假设 EMPNO 字段的值是惟一的。如果需要,您可以使用 DB2 Control Center 来更改表,并将 EMPNO 字段增加为关键字段,但是您也可以按我即将展示的方法解决该问题。

显示 DB2 数据
在使用了 Data Adapter Configuration 对话框来生成 SQL 命令之后,您可以单击 DataSet选项卡来指定要使用的 DataSet 类(或者创建一个新的),然后单击 Preview Data 选项卡来预览数据,以便验证是否得到了您所期望的东西。

BdsDataAdapter 类将使用一个特殊的 BdsCommand 类,用以用 select 查询所得的数据来填充数据集(dataSet)。应用程序的终端用户可以通过将其连接到诸如 DataGrid(如上次所演示的)的可视化组件,或另一诸如 ListBox 的支持列表的类来查看该数据。对于 DataGrid,您需要将其 DataSource 设置为 this.dataSet1(Data Adapter Configuration 对话框中所指定的 DataSet)以及将 DataMember 设置为 Table1。对于由 ListBox 显示一系列 EMPNO 值,您必须执行同样的步骤,但是这次要将其连接到 Table1.EMPNO 字段。

如果您将 bdpDataAdapter 的 Active 属性设置为 true,那么您将看到设计时的实时数据(同样见 图 4)。

处理 DB2 数据
虽然能在设计时看到实时数据是极好的,但是多数人不希望仅限于查看数据,还希望更改数据,修改在网格中显示的一些字段,也许还要插入新的记录,或者甚至删除一条或多条现有记录。

当使用 ADO.NET(或 BDP for .NET)处理 DB2 UDB 表时,您必须理解您并不是将修改直接写入 DB2 SAMPLE 表,而是在操作本地的 DataSet,它将为您保存更改(更新、插入和删除),准备作为一组 update、insert 和 delete SQL 命令发送给 DB2 UDB。

换言之,直到您将所有更新发送给 DB2 SAMPLE 表时,才能在客户端看到其更改,并且只能在客户端看到。这也意味着您默认地使用优化锁定,因为当客户机开始进行更新时(在客户端),您没有锁定数据库,而是只有当将更改送回 DB2 SAMPLE 数据库时才锁定。在那个时刻,其他人可能也做出了更改并且与您的更改发生冲突,那么您得到的不是更新成功,而是返回一个异常以通知您更新失败。但还是让我们按部就班地进行,先让我们处理好更新本身。

记得图 3 中的 Data Adapter Configuration 对话框吗?如果您已经使用该对话框为 Update 和 Delete SQL 命令创建(非优化的) SQL 命令,那么这些命令可能包含了许多参数。通过 ADO.NET 方式,您可能必须创建和连接这些参数,才能调用 Update 方法。幸好,并非真的需要如此,因为 Borland Data Adapter 十分智能,足以在幕后使用 AutoUpdate 方法完成所有工作 — 创建 SQL 命令,以及创建和填充参数。

总之,若要将 DataSet 中的更改(更新、插入和/或删除)送回给 DB2 SAMPLE 表,您需要编写下列代码:


            private void button1_Click(object sender, System.EventArgs e)
            {
            if (this.dataSet1.HasChanges())
            this.bdpDataAdapter1.AutoUpdate();
            }

添加包含 this.dataSet1.HasChanges() 的这一行只是为了说明您可以真正检查任何暂挂的(pending)更改(在关闭应用程序时进行的有效工作,给用户提供了最后一次机会以将所有未保存的更改发送给 DB2 UDB 表)。

为了更详细和更细致地展示幕后所进行的工作,考虑下列方法实现,它完成完全相同的工作,但是这次将显式地使用 BdpCommandBuilder 类来动态地构建 SQL update、insert 和 delete 命令。


            private void button2_Click(object sender, System.EventArgs e)
            {
            if (this.dataSet1.HasChanges())
            {
            Borland.Data.Provider.BdpCommandBuilder cb =
            new Borland.Data.Provider.BdpCommandBuilder(bdpDataAdapter1);
            try
            {
            cb.UpdateMode = Borland.Data.Common.BdpUpdateMode.All; // Key
            bdpDataAdapter1.Update(dataSet1, "Table1");
            }
            catch
            {
            // Handle the error...
            }
            }
            }
            

请注意 BdpCommandBuilder 类的 UpdateMode 属性,我必须将之设置为 BdpUpdateMode.All,因为 EMPLOYEE 表没有主键(否则,您可以使用 BdpUpdateMode.Key 以允许 BdpCommandBuilder 生成优化的 SQL 命令)。

还请注意 try-catch 块的使用,我在其中响应可从服务器接收的(或当您指定了 BdpUpdateMode.Key,却没有主键,从调用 Update 命令接收的)所有异常。这次,我将真正的错误处理留给您 —— 要么显示一条消息,要么将更改保留在 DataSet 中,以便您可以编辑它们并重试一次。

如果您出于某种原因需要显式地跳过您在本地所做的更改(即在您将其发送给 DB2 SAMPLE 数据库之前),那么您可以调用 RejectChanges 方法,如下所示:


            private void button3_Click(object sender, System.EventArgs e)
            {
            dataSet1.RejectChanges();
            }

图 4 中显示了实时数据以及三个按钮 —— 两个按钮带有不同的更新机制,而另一个按钮则拒绝更改:

图 4. 三个按钮与实时数据
图 4. 三个按钮与实时数据

最后一个屏幕快照展示了对其中一条记录稍做更改之后运行时的应用程序:

图 5. 运行时的应用程序
图 5. 运行时的应用程序

这展示了您如何可以使用 C#Builder 应用程序和 BDP 产生动态 SQL,用以不但显示,而且更新、插入或删除 DB2 SAMPLE 数据库表中的记录。但如何容易地部署或安装这种使用 BDP for .NET 与 DB2 UDB 进行对话的应用程序呢?

部署应用程序
正如我在前面一节中所解释的,BDP 程序集是通过一个强键标志的。这意味着它们可部署在 Global Assembly Cache(GAC)中。实际上,您可以通过两种方式部署使用 BDP 的 C#Builder 可执行程序。第一种总是可用的,并且通常称作 XCOPY 部署。这意味着您只需在单个目录中放置所有所需的文件(可执行程序和程序集),并且可以使用 XCOPY 将之部署到另一机器上。对于 C#Builder 可执行程序,另一台机器必须带有 .NET Framework version 1.1。为了连接 DB2 UDB 表,您还必须在该机器上安装 DB2 UDB v7.1 或 v8.1(例如,DB2 UDB v8.1 Personal Edition),或者至少安装 DB2 客户机。

您还需要部署来自 C#Builder 产品(可自由发布的)的四个文件,即:
Borland.Data.Provider.dll — Borland Data Provider for .NET — Borland.Data.Design 和 Borland.Data.Provider 都带有 BdpConnection、BdpAdapter 等。
Borland.Data.Common.dll — 带有 Borland.Data.Common(BdpError、BdpException 等)和 Borland.Data.Schema 的公共 BDP 文件。
Borland.Data.Db2.dll — Borland.Data.Db2 中 DB2 UDB 的特定类(比如 BdpDB2、DB2Command 等)。
bdpdb2.dll — 链接到 db2cli.dll 的 Win32 DLL。

如果您疑惑 Borland.Data.Design 名称空间为何包含在 Borland.Data.Provider.dll 程序集中,那么我可以给您的惟一理由就是 Login Dialog。请注意这在 C#Builder 的未来版本中可能全部都会更改,但是此时,这四个文件以及您的 C#Builder 项目可执行程序和 DB2 UDB 都需要进行部署。

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

结束语
在本文中,我展示了 DB2 UDB 是 .NET Framework 上一个功能强大的 DBMS,可通过 Borland Data Provider for .NET 来访问,通过许多设计时和运行时的支持(包括自动的(优化的)SQL 命令生成)增加了 ADO.NET 体验。

部署处理 DB2 UDB 的 C#Builder 应用程序只需要四个附加文件,并且可使用 XCOPY 或通过在 Global Assembly Cache 中放置程序集(避免 DLL Hell 问题)来完成。

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

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有