级别: 初级 Jeremy McGee
| XML error: Please enter a value for the author element's jobtitle attribute, or the company-name element, or both. |
2003 年 12 月 01 日 本文概述了在将一个用 C# for MicrosoftҖ Visual Studio .NET 和 Microsoft SQL Server 编写的应用程序改为使用 Borland C#Builder 和 IBM DB2 Universal Database(DB2 UDB)的应用程序时需要做的一些事情。本文使用了 Microsoft IBuySpy 示例应用程序,这是 www.asp.net 提供的一个免费示例 C# 系统。这个 ASP.NET 应用程序展示了在将一个中等大小的系统移植到 DB2 UDB 和 C#Builder 时所需遵循的步骤。
简介
本文概述了将一个用 C# 编写的针对 Microsoft® Visual Studio .NET
和 Microsoft SQL Server
的应用程序改为使用 Borland® C#Builder
TM
和 IBM® DB2® Universal Database
TM (DB2 UDB)的应用程序时需要做的一些事情。我将使用
Microsoft IBuySpy 示例应用程序,这是
www.asp.net
提供的一个免费示例 C# 系统。这个 ASP.NET
应用程序展示了将一个中等大小的系统移植到 DB2 UDB
和 C#Builder 所需遵循的基本步骤。
本文以
转换 IBuySpy 以使用 IBM DB2 UDB V8.1
为基础,这是关于使用 Microsoft Visual Studio
.NET
的一个教程。我们已经更新了这个教程,在教程中使用了最新版本的
IBuySpy,并且还给出了如何使得这个程序变为使用
C#Builder 和 Borland Data Provider 的细节。
IBuySpy 本身是一个关于如何使用 C#
编写一个中等大小的数据库应用程序的例子。它使用了存储过程,并且清晰地将用户界面逻辑与业务逻辑分离开来。
需要些什么?
您将需要从
www.asp.net
获得 IBuySpy 应用程序的一个副本。还需要
转换 IBuySpy 以使用 IBM DB2 UDB V8.1
的一个副本。
当然,您还将需要一个
DB2 UDB
(Personal Developer's Edition
包括应用程序开发客户机,后者包括 .NET Framework
库)以及
DB2 Migration Toolkit。为了编辑和运行这个应用程序,还需要
Borland C#Builder Enterprise。
要做些什么?
- 第一步是创建 IBuySpy 数据库。IBuySpy
要使用存储过程,因此 DB2 Migration Toolkit
将帮助我们将这些存储过程从 SQL Server 转变到 DB2 UDB。
- 第二步是将这个 C# 应用程序改为使用 Borland Data Provider。
将脚本从 SQL Server
移植到 DB2 UDB
下载了 IBuySpy
之后,运行安装程序。这将拆开打包的源代码,并试着建立一个
SQL Server 数据库(见
图
1)。如果您安装了
SQL Server 或者 MSDE,那么就可以完成安装程序,并且看到该应用程序如预期的那样工作——否则,这个时候安装过程就会中止。
图 1. 安装 IBuySpy
的最后一步是配置一个 SQL Server 数据库。
本文将讨论如何手动地创建一个
DB2 UDB 数据库。
接下来,使用 DB2 Control Center,创建一个名为
STORE 的数据库,使用 English-language
默认选项(见
图
2)。要做到这一点,打开
Control Center,展开代表 DB2 UDB
主机的节点,选择适当的实例,然后右键点击
Databases节点并选择
Create >Database Using Wizard。(如果您愿意,也可以从一个
DB2 命令窗口输入
db2 create database store using codeset UTF-8 territory US
。)
图 2. 使用 DB2 Control Center
创建一个新的数据库
SQL Server 和 DB2 UDB 都使用 SQL,但是在使用时又各有不同的特色,尤其是在存储过程方面。IBuySpy
应用程序是使用
StoreDB.sql
脚本创建 SQL Server
数据库的,因此您将需要转变这个脚本。
DB2 Migration Toolkit
使得这种转变轻而易举,但是需要遵循一些特别的步骤以确保
DB2 Migration Toolkit
正确地执行了转变。脚本包括一些额外的命令,用于创建数据库和安排您需要删除的一些定时作业。
在 C#Builder 中,要做到这些,应首先从 IBuySpy
应用程序源代码树打开文件
StoreDB.sql
,将它保存为一个新文件,即
StoreDB2.sql 。接着删除原先的整个
CONFIG
段,从顶部一直到
MAKE TABLES AND SPROCS
注释。再接着,在该文件的底部,删除最后一段,从
ADD SCHEDULED JOBS 注释一直到文件的结尾。这样就应该只剩下
Load Data
这一段了。
您还需要修改脚本中的几个大小写问题,因为
Migration Toolkit
是大小写敏感的,因此在这里要从头至尾进行如下替换:
- 用
EmailAddress替换
EMailAddress
- 用
CartID替换
CartId
- 用
OrderDetails替换
orderdetails
- 用
UnitCost
替换
Unitcost
- 用
Quantity
替换
quantity
载入 Migration Toolkit,创建一个新项目,然后将
SQL Server 脚本
StoreDB2.sql 移植到 DB2 UDB
数据库:
- 导入 StoreDB2.sql 作为 SQL 文件。
- 选择
Convert标签,接受默认选项,然后点击
Convert。
- 如果存在任何较大的问题,就会显示出
Refine
标签页。检查错误,调查是否存在问题。如果存在问题,那么应更正脚本。
- 当看到脚本运行正常时,选择
Generate Data Transfer Scripts
标签并点击
Generate Scripts。
- 在
Deploy
标签页上,输入正确的登录信息,以便登录到数据库,然后点击
Deploy(见图 3)。
图 3.
在将脚本移植到 DB2
UDB 数据库时 Migration Toolkit 的最后状态
在这一过程的最后,您将完成
StoreDB2.DB2
脚本的创建,同时也在 DB2 UDB
数据库中创建了 IBuySpy
数据的一个版本。这个脚本包括了 SQL Server
命令,这些命令对应于转换后在 DB2 UDB
中等同的 SQL
命令。如果编辑这个文件,您将看到语法会有所不同,但是最后的结果是一样的。(如果您习惯于 SQL Server
开发,那么这是查看在 DB2 中等同的 SQL
命令的最好方式。)
接下来的一步是转变 IBuySpy
应用程序本身,使其使用 DB2 UDB,而不是使用
SQL Server。不过,首先还是让我们回顾一下
.NET 数据库组件是如何工作的,并看看 DB2 UDB
如何适应 ADO.NET。
.NET
数据库开发的背景知识
ADO.NET (或者更恰当地说,是在
System.Data
中实现的一些类)并不关心获取数据时所使用的提供者(provider)是什么,只要这些提供者实现了适当的接口,能够用
DataSet
或
DataReader
组件填充数据库表就行了。例如,IBuySpy
使用
System.Data.SqlClient 类来直接与
SQL Server 打交道。
对于 DB2 UDB 下的
System.Data.SqlClient ,IBM
有一个等同的受管提供者。
IBM.Data.DB2
管理的提供者包含了一些类,这些类与它们在 SQL Server
中的等同物(
System.Data.SqlClient 中的类)有着直接的
1 对 1
的对应关系,该提供者还提供了一些附加的属性,以获得
DB2 UDB 特有的一些特性。在
转换 IBuySpy 以使用 IBM DB2 UDB V8.1
中用到了这个受管提供者。该教程第 11 和
12 页中的步骤使用的是 C#Builder,它们工作起来与使用
Visual Studio .NET 时一样的好。
对于 C#Builder,Borland 创建了 Borland Data
Provider。这提供了类似于 Microsoft
驱动程序的接口,但是并不局限于任何特定的后端数据库。从
SQL Server 管理的提供者转变到 Borland Data Provider
十分地简单和方便。
System.Data.SqlClient 只使用 SQL Server。虽然使用
System.Data.OleDb
中同等的一些类来与 DB2 UDB
打交道也是可能的,但是由于 OLE DB
需要使用一个 Windows
兼容层,这样就比本地管理的 Borland Data
Provider 要慢些。
探索 Borland Data Provider
当您使用 Microsoft 提供者连接到 SQL Server
或 MSDE 时,要使用一个
SqlConnection
组件。在 Borland Data Provider
中使用的类似的组件是
BdpConnection。类似地,
SqlDataAdapter
用
BdpDataAdapter代替,
SqlCommand
用
BdpCommand代替,
SqlParameter
用
BdpParameter代替,依此类推。
这些组件并不完全相同,因为 Borland Data Provider
提供了一些附加的特性。例如,它包括在 Windows Forms
应用程序中在设计时查看存活的数据的能力。
在很多情况下,Borland Data Provider
可以从一个数据库系统切换到另一个数据库系统,而且根本不用修改源代码。我将向您展示,通过对配置文件作一点修改,确实可以要么在
SQL Server 环境下运行,要么在 DB2 UDB 环境下运行。
探索 Borland Data Provider
这些附加属性和方法的一种很好的方式就是创建一些用于测试的 Windows Forms
应用程序。参见 DB2 产品园地
Borland
区中的其他文章,以获得更多信息。
将 IBuySpy 更新为使用 Borland Data Provider
IBuySpy
中的所有数据库访问都是通过 5 个 C#
程序单元实现的。因此,我们可以更改这些程序单元,使它们使用
Borland Data Provider,这样访问数据库就很容易了。
将 IBuySpy 导入 C#Builder
在 C#Builder中,使用
File > Open Project导航到安装了
IBuySpy
源代码的目录下。您需要更改对话框底部的
Files of type选项,接着打开 Visual Studio
项目文件
StoreCSVS.csproj 。C#Builder
将导入这个文件,并将其转变为 Borland Developer Studio
中的等同物
StoreCSVS.bdsproj 。Project Manager
应该会显示
IBuySpy.dll 项目(见图
4)。
图 4. IBuySpy
应用程序可以直接导入 Borland C#Builder 中
不过,在进入下一步之前,还有两个细节需要讲一下。首先,您需要告诉
C#Builder 哪一个是应用程序的默认 Web
页面:具体的做法是,右键点击
Default.aspx
文件,选择
Set as Start Page。
接下来,需要告诉 C#Builder
您想在调试的时候使用哪个 Web
服务器作为主机:具体的做法是,右键点击
IBuySpy.dll 文件名,选择
Options。在对话框左边的树视图中,选择
ASP.NET,并如图 5 所示设置选项。
图 5. 在 C#Builder 中为项目设置调试选项
将程序单元更新为使用
Borland Data Provider
我们想要更新的单元在项目的 Components
文件夹中。例如,看一下
CustomersDB.cs
这个文件,这个文件包含了所有必需的业务逻辑,包括添加、查询和使客户通过
IBuySpy 系统的认证(见图 6)。
图 6. 数据访问是由 Components
目录中的 C# 单元处理的
因为数据访问集中在这 5
个单元中,即使对系统作大的更改也不会牵涉到应用程序其他部分的细节,因而这种更改非常容易。在这里您可以看到,用于数据访问的代码相当简单。
继续下去,更改这些组件,使它们使用 Borland Data Provider
等同物。首先,为项目添加一个对
Borland.Data.Provider
和
Borland.Data.Common
组合的引用,具体做法是在
Project Manager
中右键点击
References标签,并选择
Add Reference。
接下来需要将 SQL Server 对象替换为它们的
Borland Data Provider 等同物。对于这 5
个文件中的每个文件:
CustomersDB.cs
OrdersDB.cs
ProductsDB.cs
ReviewsDB.cs
ShoppingCartDb.cs
进行如下替换,在编辑器中使用
Edit > Replace:
- 用
BdpConnection替换
SqlConnection
- 用
BdpCommand替换
SqlCommand
- 用
BdpDataAdapter替换
SqlDataAdapter
- 用
BdpParameter替换
SqlParameter
- 用
BdpDataReader替换
SqlDataReader
还需要像下面这样更改类型,同样使用
Edit >Replace:
- 用
BdpType.Int32替换
SqlDBType.Int
- 用
BdpType.String替换
SqlDBType.NVarChar
- 用
BdpType.DateTime替换
SqlDBType.DateTime
- 用
BdpType.Decimal替换
SqlDBType.Money
然后,对于那些不返回结果集的存储过程,您需要设置其输出参数的精确度。在
IBuySpy 中,在
CustomersDB.cs 、
ProductsDB.cs
和
ShoppingCartDb.cs
源文件中都有这样的例子。IBuySpy 代码在每条
// Add Parameters to SPROC
注释的后面设置各个
BdpParameter
对象。其中设置了一个输出参数——换句话说,该参数的
Direction 属性被设为
ParameterDirection.Output
或
ParameterDirection.Both——
Precision
属性也需要被设置。
对于字符串,将
Precision
属性设置为希望的最大长度。对于数字,将该属性设置为该字段的总长度。
例如,对
GetCustomerDetails方法的
FullName
参数的设置如下:
BdpParameter parameterFullName
= new BdpParameter("@FullName",
BdpType.String, 50);
parameterFullName.Direction =
ParameterDirection.Output;
parameterFullName.Precision = 50;
myCommand.Parameters.Add(parameterFullName);
|
另外还需对每个返回一个结果集的存储过程进行小的修改。这里有必要将结果类型覆盖为一个
BdpDataReader。例如,在 OrdersDB 中,
GetCustomerOrders
方法倒数第二行应该是这样的:
BdpDataReader result =
(BdpDataReader)
myCommand.ExecuteReader(CommandBehavior.CloseConnection);
|
在
ProductsDB.cs 、
ReviewsDB.cs
和
ShoppingCartDb.cs
中有更多这样的例子。
检查存储过程的参数次序
SQL Server 和 DB2 UDB 之间一个很大的不同是,对于 DB2,存储过程的参数次序是很重要的。在某些地方,存储过程的参数需要变换位置:
- 在
ProductsDB.cs 中的
GetProductDetails()
方法中,将参数的次序变换为: @ProductID, @ModelNumber, @ModelName, @ProductImage, @UnitCost,
@Description。
- 在
ShoppingCartDB.cs 中,对于
AddItem() 和
UpdateItem()
这两个方法,都将它们的参数次序更改为:@CartID, @ProductID,
@Quantity。同样在这个单元中,将 RemoveItem()
方法的参数次序变换为:@CartID, @ProductID。
做完这些之后,就可以编译这个应用程序了。通过运行应用程序可以确信没有语法错误,并确信在搜索-替换操作中没有遗漏任何组件。
设置配置字符串和测试应用程序
运行应用程序之前要做的最后一步是更改
Web.config
文件中的连接字符串,因为 Borland Data Provider
所使用的语法与 SqlClient
所使用的语法有很大的不同。在第 5
行像下面这样替换
ConnectionString
属性的值:
assembly=Borland.Data.Db2,Version=1.1.0.0,Culture=neutral,
PublicKeyToken=91d62ebb5b0d1b1b;
vendorclient=db2cli.dll;database=STORE;provider=DB2;
username=username;password=password |
运行应用程序。过了一小段时间之后,Web
浏览器应该装载了起始页(见
图
7)。(您可能需要按下
Alt-Tab 键将这个页面调到前面来——C#Builder
需要连接到 ASP.NET
工作进程,这需要花费一些时间,如果是在一个比较忙的系统中,这一点会更明显。)试着添加一个新客户,并订购一些物品。
图 7.
经过移植的应用程序,现在用的是 DB2 UDB
数据库之间的切换
现在您的应用程序使用的是 Borland Data
Provider,您可以通过简单地更改
Web.config
中的 ConnectionString
在不同数据库之间来回切换。例如,要切换回
SQL Server,可以将 ConnectionString 更改为:
assembly=Borland.Data.Mssql,
Version=1.1.0.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b;
vendorclient=sqloledb.dll;database=database;
username=username;hostname=hostname;password=password;provider=MSSQL |
经过编译后,应用程序应该就可以直接运行了。
结束语
本文讨论了将一个中等复杂的应用程序从 SQL Server
和特定于 Microsoft 的 SqlClient 提供者移植到 DB2 UDB
和 Borland Data Provider
时涉及的一些步骤。对于您自己的应用程序来说,移植的时候同样也是采取这些步骤。首先,移植服务器上的数据和应用程序对象,例如存储过程。做完这些之后,需要修改应用程序,用 Borland Data
Provider 替换 SqlClient 提供者。
DB2 UDB 最大的优点之一就是 Migration
Toolkit,它使得一个系统从 SQL Server 到 DB2 UDB
的移植非常简单,这一点前面我已经讲过。当结合使用
Borland Data Provider 和 C#Builder
时,您就可以编写高速的、数据库无关的应用程序。
参考资料
免责声明
本文包含样本代码。IBM 授予您(“被许可方”)使用这个样本代码的非专有的、版权免费的许可证。然而,该样本代码是以“按现状”的基础提供的,没有任何形式的(不论是明示的,还是默示的)保证,包括对适销性、适用于特定用途或非侵权性的默示保证。IBM 及其许可方不对被许可方由于使用该软件所导致的任何损失负责。任何情况下,无论损失是如何发生的,也不管责任条款怎样,IBM 或其许可方都不对由使用该软件或不能使用该软件所引起的收入的减少、利润的损失或数据的丢失,或者直接的、间接的、特殊的、由此产生的、附带的损失或惩罚性的损失赔偿负责,即使 IBM 已经被明确告知此类损害的可能性,也是如此。
关于作者  | |  |
Jeremy McGee
是使用 dBASE III Plus
创建网络应用程序的始作俑者之一,当时还是 PC
时代的早期。从那以后,他使用过 Paradox、Delphi
和 Visual Studio。同时,他还是位于英国南安普顿市的一家咨询公司的董事。
|
对本文的评价
|