级别: 初级 Sonali Surange, IBM Database Desktop Applications, 加利福尼亚旧金山
2003 年 8 月 01 日 使用样本 C# 应用程序,本文向您显示了 IBM 工具如何在 Microsoft Visual Studio .NET 上快速开发基于 DB2 的应用程序。
编者注:可以从
DB2 .NET 支持 beta 测试版 2获得用于 Visual Studio .NET 的 IBM DB2 开发外接程序,在 DB2 V8 修订包 2 可用时,它还可以作为其中的一部分而获得。
简介
通过使用样本应用程序,本文向您显示了 IBM® 工具如何在 Microsoft® Visual Studio .Net 上快速开发基于 DB2 的应用程序。在本文中,我首先将重点描述由 IBM Explorer 提供的、用于在 Microsoft Visual Studio .Net 上进行 DB2 开发的功能。然后我将为您演示如何构建一个数据绑定的基于 Windows® 窗体的样本应用程序,以访问 DB2® Universal Database(UDB)数据源。该样本包括两部分:
-
第 1 部分演示了使用数据绑定从 DB2 表检索、更新、插入和删除数据。
-
第 2 部分演示了使用数据绑定从 DB2 表检索并更新 BLOB 和 CLOB。
我还将描述如何测试样本。
IBM Explorer 概述
IBM Explorer 是将 DB2 UDB 集成到 Microsoft Visual Studio .Net 的 IBM 解决方案的一部分。IBM Explorer 可以让您创建和操作到本地和远程 DB2 UDB 数据源的数据连接并浏览其内容。通过允许创建预先配置的 DB2 数据组件,IBM Explorer 使得为访问 DB2 数据源的工程进行快速应用程序开发更为方便。这些组件可以进一步用于应用程序开发。
IBM Explorer 提供了以下关键功能:
- 将 DB2 连接添加到现有的本地或远程数据库(在 Windows 2000®、UNIX® 和 OS/390® 上)。浏览表和视图、存储过程以及用户定义的函数(表和标量)的详细特性。在标准的 Microsoft Visual Studio.Net 特性窗口中显示列和参数信息。
- 查看表的特性 - 名称、类型、模式和其它标准特性。
- 查看列的特性 - 主键、允许为空、标识列、数据类型以及其它标准特性(如名称和模式)。
- 查看存储过程和函数的特性 - 特定名称、语言、包名、结果集数目和其它标准特性(如名称和模式)。
- 查看存储过程和函数的详细参数信息。
- 从表和视图异步检索数据,为了增强可读性请用表格格式查看结果。
- 根据您的选择,可以在需要时或在启动时从数据库检索模式信息。
- 异步执行存储过程和用户定义的函数(UDF)。以表格格式查看结果集;输入、输出、进出(in-out)和返回参数值。
- 从数据库中删除表、视图、存储过程和 UDF。
- 使用密码加密支持来维护检索到的模式信息的客户机端基于用户的高速缓存。
- 能够应用过滤器来限定只能对期望的对象检索模式信息。
- 在使用任何 Visual Studio .Net 语言(比如 C#、VB.NET 或 J#)的 Microsoft Visual Studio.Net Windows 窗体工程中,使用拖放生成 ADO.Net 数据组件。这些数据源预先针对 DB2 UDB 进行配置,可以用来进一步开发访问 DB2 UDB 的应用程序。
- 在与 Visual Studio.Net 输出窗口集成在一起的 IBM DB2 Output Message Pane 中监控数据库活动。
本文假设您已经安装了带有 Visual Studio .Net 工具的 DB2。本文还假设您已经在 DB2 安装中安装了 DB2 SAMPLE 数据库。您可以通过运行 First Steps 应用程序安装样本数据库。
使用 IBM Explorer 构建数据绑定的 DB2 应用程序
在这次练习中我们将使用 IBM Explorer 在 Visual Studio.Net 环境中创建与 SAMPLE 数据库的 DB2 数据库连接。这个连接还将进一步用来开发样本应用程序。
- 启动 Microsoft Visual Studio.Net IDE。
- 如果还没有看到 IBM Explorer 窗口,请单击
View -> IBM Explorer。
- 在
Data Connections上单击鼠标右键,然后从上下文菜单中选择
Add Connection。
- 在
Database Alias组合框中可以看到您机器上的数据库列表。选择
SAMPLE,可以有选择地添加用户名和密码。单击
Test Connection。
应当弹出一条表明成功的消息,如
图 1所示。
图 1. 测试连接
- 在
Database Connection Properties对话框上单击
OK。在 IBM DB2 Message Pane 中查看表明从数据库成功检索出模式信息的消息。如果看不见 IBM DB2 Message 窗格,那么从 Visual Studio.Net 菜单单击
View -> Other Windows -> Output,以显示 Output 窗口(
图 2)。
图 2. Output 窗口
缺省情况下,会检索出所添加的连接和过滤器的所有模式信息。可以更改这个行为以便根据需要检索数据。如果模式包含了大量数据的话,这就很有用。无论哪一种情况,数据检索都是透明的,这意味着您可以在 IDE 中工作的同时,异步地完成数据检索请求。
通过在
userOptions.xml 文件中将 PrefetchCache 设置成“false”,可以将该行为更改成“随需应变”,如下面这段摘录代码所示:
<DBAccess description="Database access settings" name="Database Settings">
<MaxRows description="Maximum number of rows to retrieve for tables
and views." val="100" type="INT" />
<Timeout description="Database command execution timeout in seconds."
val="30" type="INT" />
<PrefetchCache description="Prefetch filtered database catalogue data cache
on first retrieval." val="false" type="BOOL" />
</DBAccess>
|
请参阅
用于 Visual Studio .Net 的 IBM DB2 开发外接程序 以获取有关
userOptions.xml 的更多信息。
现在,只有在单击每个文件夹之后才能异步检索有关该文件夹的信息。例如,单击
Tables文件夹,才能异步从数据库模式中检索表列表。IBM DB2 Message Pane 表明这些请求的状态(
图 3):
图 3. 输出消息窗格
现在我们可以准备使用用于 DB2 表的数据绑定创建一个窗体。
v
现在让我们构建并测试样本 Employee 应用程序。
- 创建一个新的 C# Windows 应用程序,并称之为
db2lobs (请参阅附加的样本代码
db2lobs.zip以获取完整的代码)。本练习使用 C# 开发样本应用程序,但是任何基于公共语言运行时(Common Language Runtime)的 Visual Studio.Net 语言都可以用 IBM Explorer 来创建数据绑定应用程序。
- 将一个 Data Grid 控件和一个按钮控件放到该窗体中。将 Data Grid 控件的名称特性更改成
dataGrid_employee
。将按钮控件的文本特性更改成
Apply changes to Database,并将其名称特性更改成
applyChangesToDb
。
- 将 EMPLOYEE 表从 IBM Explorer 拖放到该窗体中。这个操作将创建两个预先配置的组件:
-
db2Connection1- 其连接字符串特性被设置成
SAMPLE数据库。
-
db2DataAdapter1- 为 EMPLOYEE 表设置
SELECT、
INSERT和
UPDATE语句(
图 4)
图 4. 预先配置的组件:db2Connection1 和 db2DataAdapter1
- 单击
db2DataAdapter1,然后单击
Generate DataSet。选择
New: DB2DataSet1,然后单击
OK。这将创建一个数据集对象和该对象的实例
db2DataSet11 。
- 为了将 EMPLOYEE 表数据绑定到数据表格上,请单击窗体上的
dataGrid_employee并在特性窗口中选择以下特性:
- 对于 DataSource - 请选择
Db2DataSet11
- 对于 DataMember - 请选择
EMPLOYEE
- 现在我们准备在这个窗体中添加一些 C# 代码,以检索和更新数据库和数据表格上的数据。
- 双击该窗体。这将会把已放入的对象的实例创建到
Form1.cs 中,然后显示
Form1.cs 代码。
在 Form1_Load 事件中添加下面这行代码(用
粗体列出):
private void Form1_Load(
object sender, System.EventArgs e)
{
this.db2DataAdapter1.Fill(
this.db2DataSet11);
}
|
-
在 Solution Explorer 中,双击
Form1.cs,再次显示处于设计方式的 Form1。双击按钮控件以创建单击事件处理程序。
添加下面这行代码(用
粗体列出):
private void applyChangesToDb_Click (
object sender, System.EventArgs e)
{
this.db2DataAdapter1.Update(
this.db2DataSet11);
}
|
测试雇员样本
- 要测试该样本,请从 Visual Studio .Net 菜单单击
Debug -> Start Without Debugging。这将构建并运行该应用程序。
您将在表格中看到部门表的数据。我们已经成功地从 DB2 数据库中检索到了数据。
- 现在添加一行并更改现有的行,如
图 5所示。单击
Apply Changes to Database 按钮,重新装入该窗体。请注意,数据表格中显示了数据库中更改过的值。
图 5. 对数据库进行更改
- 最后,在最左边那列上选择一整行,并单击键盘上的
Delete。单击
Apply Changes to Database按钮。退出并重新运行应用程序,我们会看到该行已经被删除了。
工作原理
在上面的样本中,我们使用由 Visual Studio.Net 提供的数据库表到数据表格控件的设计时数据绑定。
然后我们手工更改数据表格控件中的值。这个操作更改了底层数据适配器对象中的值。
当我们单击
Apply Changes to Database时,就调用了数据适配器更新方法(
步骤 6-2中所添加的代码)。这个操作根据数据表格中所进行的更改对该数据库执行数据库更新、插入和删除操作。
检索并更新 BLOB 和 CLOB
现在我们将添加窗口控件以便在已构建的窗体中显示雇员的照片和简历。我们将使用 IBM Explorer 来创建到 EMP_PHOTO 表和 EMP_RESUME 表的数据绑定。最后,我们将添加显示并更新雇员照片和简历所必需的一些 C# 代码。(请参阅附加样本
db2lobs.zip以获取完整的代码。)
遵循如下所列步骤:
- 打开已创建的 db2lobs 工程。
- 将图片框控件和文本框控件放入窗体中。将图片框的名称特性更改成
photo并将文本框的名称特性更改成
resume。我们将使用这两个控件来分别显示雇员的照片和简历。添加另一个文本框以从用户获取文件名以更新雇员照片。
- 将 EMP_PHOTO 和 EMP_RESUME 表从 IBM Explorer 拖放到窗体中。这个操作将创建两个预先配置的组件(
图 6):
-
db2DataAdapter2- 为 EMP_PHOTO 表设置了 SELECT、INSERT、UPDATE 和 DELETE 语句。
-
db2DataAdapter3- 为 EMP_RESUME 表设置了 SELECT、INSERT、UPDATE 和 DELETE 语句。
图 6. db2DataAdapter2 和 db2DataAdapter3
- 单击
db2DataAdapter2,然后单击
Generate DataSet。选择
New: Db2DataSet2,然后单击
OK。
单击
db2DataAdapter3,然后单击
Generate DataSet。选择
New: Db2DataSet3,然后单击
OK。
- 现在我们准备给这个窗体添加一些 C# 代码以便为该窗体上的控件添加数据绑定。双击该窗体。这个操作将把已放入的对象的实例创建到 Form1.cs 中,然后显示 Form1.cs 代码。
- 在 Form1.cs 类中添加以下引用和私有变量:
using System.Drawing.Imaging;
using System.IO;
private int currRow = 0;
private Byte[] byteBLOBData;
|
- 在 Form1_Load 方法中,添加以下代码(用
粗体列出)。这将为数据表格的 Click 事件创建事件处理程序。我们将使用这个事件来标识数据表格中当前所选中的行。
EMP_PHOTO 表和 EMP_RESUME 表包含了来自 EMPLOYEES 表的各项的子集。要显示该子集,我们将更改缺省情况下生成的选择语句。
private void Form1_Load(
object sender, System.EventArgs e)
{
try{
this.db2SelectCommand1.CommandText = "SELECT
\\"EMPNO\\", \\"FIRSTNME\\", \\"MIDINIT\\",
\\"LASTNAME\\", \\"WORKDEPT\\", \\"PHONENO\\",
\\"HIREDATE\\", \\"JOB\\", \\"EDLEVEL\\", \\"SEX\\",
\\"BIRTHDATE\\", \\"SALARY\\", \\"BONUS\\",
\\"COMM\\" FROM \\"ADMIN" +
"\\".\\"EMPLOYEE\\" where \\"EMPNO\\" IN
('000130','000140','000150','000190')";
this.db2DataAdapter1.Fill(
this.db2DataSet11);
this.dataGrid_employee.Click +=
new
System.EventHandler(
this.dataGrid_employee_Click);
this.db2DataAdapter2.Fill(this.db2DataSet21);
this.db2DataAdapter3.Fill(this.db2DataSet31);
displayPict();
displayResume();
}
catch
{
// error handling
}
}
|
添加以下代码为数据表格控件创建单击事件处理程序方法。这将显示雇员的照片和简历。
private void dataGrid_employee_Click(
object sender, System.EventArgs e)
{
currRow = dataGrid_employee.CurrentCell.RowNumber;
displayPict();
displayResume();
}
|
-
EMPLOYEE 表中的每个雇员项在 EMP_PHOTO 表中包含三个对应项。我们将使用值
current row*3 在 Windows 图片框控件中显示数据表格中所选中的第一个雇员的照片。
类似地,EMPLOYEE 表中的每个雇员项在 EMP_RESUME 表中包含两个对应项。我们将使用值
current row*2 在 Windows 编辑框控件中显示数据表格中所选中的雇员的第一份简历。
添加以下私有函数以显示照片。请注意,为了将照片保存为文件系统上的文件,去掉注释代码的注释符(双斜杠)。
private void displayPict()
{
try
{
byteBLOBData =
Byte[])(this.db2DataSet21.Tables["EMP_PHOTO"].
Rows[currRow*3]["PICTURE"]);
MemoryStream stmBLOBData =
new
MemoryStream(byteBLOBData);
photo.Image= Image.FromStream(stmBLOBData);
// Optionally to save this image to a file uncomment the following code
//FileStream fs = new FileStream(currRow.ToString()+".jpg", FileMode.CreateNew);
//stmBLOBData.WriteTo(fs);
}
catch ( Exception exp)
{
// error handling
}
}
|
添加以下私有函数以显示简历。
private void displayResume()
{
try
{
this.resume.Text =
(
string)this.db2DataSet31.Tables["EMP_RESUME"].
Rows[currRow*2]["RESUME"];
}
catch ( Exception exp)
{
// error handling
}
}
|
- 最后,我们将添加代码以专门处理 BLOB 和 CLOB 的更新。我们将使用通过 IBM Explorer 拖放操作创建的预先定义的 DB2 命令对象。我们将修改这些对象以专门处理 BLOB 和 CLOB 的更新和检索。(请参阅
db2lobs.zip 中的
applyChangesToDb_Click 。)
测试雇员样本
- 要构建并运行该应用程序,请从 Visual Studio .Net 菜单单击
Debug -> Start Without Debugging。请注意,表格显示 EMPLOPYEE 表的值,图片和文本框显示雇员的照片和简历(请参阅
图 7)。
图 7. Employee 表
- 我们现在将更新简历和照片。只要在文本框中更改简历文本并输入新照片的文件名。单击
Apply Changes to Database。退出并重新运行应用程序,查看数据库的更新结果(
图 8)。
图 8. 数据库现在已经更新了
工作原理
对通过拖放操作创建的 DB2Command 对象进行修改以执行 BLOB 和 CLOB 的更新。
要在图片框中显示照片,请根据表示 EMP_PHOTO 表的数据集的“picture”字段创建 MemoryStream 对象。图片框的图像特性被设置成该内存流。这在图片框中显示照片。这是通过
步骤 5-3 中所添加的
displayPict() 代码来实现的。
DB2UpdateCommand2 是为 EMP_PHOTO 表而生成的预先配置的更新命令。
DB2UpdateCommand_photo 是这个命令的副本,只不过除去了原来的 photo 参数。这使 BLOB 表实现了最优化的更新,因为 BLOB 不属于主键。
从指定的文件中读取要被更新的 BLOB 数据并将它转换成字节数组。该值被设置成
DB2UpdateCommand_photo 对象的“picture”参数。DB2Command 对象上的
executeNonQuery 方法用该新值更新了数据库。(请参阅
db2lobs.zip 中的
applyChangesToDb_Click 代码。)
要在多行文本框中显示简历,请将文本框的 Text 特性设置成表示 EMP_RESUME 表的数据集的“resume”字段。这在文本框中显示简历。通过
步骤 5-3中所添加的代码来实现这一操作。
DB2UpdateCommand3 是为 EMP_RESUME 表生成的预先配置的更新命令。与 blob 更新命令相似,
DB2UpdateCommand_resume 是 DB2UpdateCommand3 命令的副本,只不过除去了原来的 resume 参数。这使 CLOB 表实现了最优化的更新,因为 CLOB 不属于主键。
从简历文本框读取要被更新的 CLOB 数据。该值被设置成
DB2UpdateCommand_resume 对象的“resume”参数。DB2Command 对象的
executeNonQuery 方法用该新值更新了数据库。(请参阅
db2lobs.zip 的
applyChangesToDb_Click 中的代码)
结束语
我们使用 IBM Explorer 来添加 DB2 连接并浏览数据库内容。我们简单地研究了一下 IBM Explorer 如何异步检索模式信息并在 IBM DB2 Message 窗格中显示状态消息。我们研究了该如何更改选项以便只在单击文件夹后才从数据源检索数据。
使用 IBM Explorer,我们创建了 ADO.Net 数据绑定应用程序。我们先对一张简单的表执行数据库操作,然后扩展该应用程序,成功地检索并更新了 BLOB 和 CLOB。
参考资料
声明
IBM 可能已拥有或正在申请与本文档内容有关的各项专利。提供本文档并未授予用户使用这些专利的任何许可证。有关许可证查询的事宜,用户可以通过书面形式联系:
IBM Director of Licensing
IBM Corporation
North Castle Drive Armonk, NY 10504-1785
U.S.A.
所有有关 IBM 未来方向或意向的声明都可随时更改或收回,而不另行通知,它们仅仅表示了目标和意愿而已。
下载
| 描述 | 文件类型 | 文件大小 | 下载方法 | | db2lobs.zip | zip | 92 KB | HTTP
|
关于作者  | 
|  |
Sonali Surange是一位咨询软件工程师(Advisory Software Engineer),在 IBM 旧金山实验室研究“数据管理应用程序开发工具”。
|
对本文的评价
|