中国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
ASP.NET 处理 DB2 UDB 表中的数据
作者:佚名 时间:2005-09-07 12:00 出处:互连网 责编:小渔
              摘要:使用 C#Builder 和 ASP.NET 处理 DB2 UDB 表中的数据
Bob Swart
Bob Swart Training & Consultancy
2004 年 2 月
本文在作者前一篇文章的基础上展示了如何使用 IBM DB2 UDB 表、C#Builder 以及用于 .NET 的 BDP 来创建应用程序,并将之部署为 ASP.NET Web 表单(使用了功能强大的 asp:DataGrid 控件)。本例还向用户展示了如何更新 DB2 UDBUDB SAMPLE 表中的数据以及删除其中的记录。

简介
在 上篇文章中,我用 Borland® C#Builder TM 和 Borland Data Providers for ADO.NET 创建了一个 ASP.NET Web Forms 应用程序(使用了功能强大的控件: asp:DataGrid ),用以说明如何在 Web 上发布 IBM® DB2® UDB TMSAMPLE 表中的数据。这次,我将对这个例子略微加以改进,以允许用户不但能查看数据以及浏览表,而且还能更新 DB2 UDB SAMPLE 数据库中的数据或删除其中的记录。

安装 DB2 UDB Version 8
我的上篇文章中已经提到过,Borland 已经发布了 C#Builder 的 Architect 版。与 Enterprise 版一样,该版本也附带了一张包含 DB2 UDB Version 8 企业开发版)的 CD-ROM。它不是一个试验版本,而是一个真正的开发版。因此,我决定在本文(以及下一篇关于 C#Builder 的文章)中安装并使用 DB2 UDB v8。

安装好 DB2 UDB v8 之后,您就可以用随之启动的“IBM DB2 First Steps”向导生成特殊的 SAMPLE 数据库,之前我们就已经使用过该数据库(这次还将使用)。顺便说一句,DB2 UDB 产品的文档与样例也都会引用 SAMPLE 数据库中的表,因此,建议先创建好该数据库。

创建 C#Builder 的 ASP.NET Web Forms
C#Builder Professional,C#Builder Enterprise 和 C#Builder Architect 都含有 Borland Data Providers for ADO.NET,但只有 Enterprise 和 Architect 版包含了连接到 DB2 UDB SAMPLE 数据库的 BDP 驱动程序。(对于 C#Builder Professional,您可以使用 IBM 自带的 .NET 驱动程序(在 此处下载 beta 版),但那是以后要讨论的事情。)。

然而,我们首先需要重新创建 ASP.NET 工程来容纳 BDP 组件。我将简要地回顾 上次创建该工程的步骤,然后再继续添加编辑支持以及删除功能(下次将添加更新 DB2 UDB 表中的数据时需要的输入验证功能)。

启动 C#Builder,执行 File | New - ASP.NET Web Application并在 New ASP.NET Application 对话框中指定工程名称。该工程名称还将用作一个新的虚拟目录名(该目录不能是已存在的,否则将得到出错消息)。如下面的图 1 所示,此例采用 DB2UDB 作为工程名。

图 1. DB2UDB 作为新的 ASP.NET 应用程序
图 1. DB2UDB 作为新的 ASP.NET 应用程序

当您单击 OK时,就会在新的虚拟目录下创建了一个新的 C#Builder 工程。请注意别名为 DB2UDB 的虚拟目录的各个服务器选项。对于 ASP.NET Web 应用程序,您只需要 “scripting” 权限,而不需要 execute 权限。 但后者对于老式的 CGI 或 ISAPI 应用程序仍然是必需的。

连接到 DB2 UDB
一旦创建了新的 ASP.NET 工程,您就可以转到 C#Builder IDE 的右上角(项目管理器的位置)并单击 Data Explorer选项卡。在这里,您将发现有多个不同的提供程序,其中当然也包括带有我们 上次创建的连接的 DB2 提供程序。如果您没有将 DB2 Connection 修改为指向 DB2 UDB SAMPLE 数据库,那么就右击 DB2Conn1节点并启动 Connections Editor。务必要指定数据库名为 SAMPLE并指定连接到该数据库所需的用户名和密码。您可以单击 Connections EditorTest按钮来验证可以进行连接了。

一旦您已经正确指定用于连接的各个值,就可以打开 Data Explorer 中的 DB2Conn1节点来查看 DB2 UDB SAMPLE 数据库中的所有表,如图 2 所示。

图 2. 带有 DB2 UDB SAMPLE 数据库的 Data Explorer
图 2. 带有 DB2 UDB SAMPLE 数据库的 Data Explorer

假设要处理 EMPLOYEE 表中的数据,您只要单击这个表(如图 2 所示)并将之拖到设计器中的 Web Form 上就可以了。虽然您可以将之放到 Web Form 上,但仍不会显示任何东西。然而,名为 BdpConnection 和 BdpDataAdapter 的两个新组件将出现在 Web Form 设计器的非可视组件区域中。

BdpConnection 组件包含了您在 Data Explorer 中指定的 DB2Conn1 连接的所有信息。而 BdpDataAdapter 组件只专门包含 EMPLOYEE 表的信息。

进一步修改 DB2 数据集
虽然 BdpDataAdapter 组件已经存在了,但您或许还希望能利用动词 Configure Data Adapter(Object Inspector 中左下角的一个链接)稍进一步地对它加以定制。 因此,您可以右击 BdpDataAdapter组件并选中 Configure Data Adapter选项来启动 Data Adapter Configuration对话框。

上次,我没有选中此对话框中的 Update、Insert 和 Delete 选项而只是设置了 Optimize 选项。然而这次,您必须生成用于 Update、Insert 以及 Delete 命令的 SQL 语句,因为它们正是本文的主题。(Optimize 选项则是另外一件事了,且有待讨论。)

若选中 Optimize 选项,像 UPDATE 和 DELETE 这类语句的 WHERE 子句就只能使用关键字段(如 EMPNO)。虽然这对于选择记录来说是完美的,但对于 PDATE 和 DELETE 语句就不那么理想了。因为更新记录时,如果您只指定了关键字段,就无法得知是否有其他的人已经修改了该记录(因为也许修改的是此记录的非关键字段)。另一方面,如果您不使用 Optimize 选项,那么 UPDATE 和 DELETE 语句的 WHERE 子句将列出记录中的所有字段。因此要确保能找到所有字段为指定值的记录后,您才可以执行 UPDATE 和 DELETE 操作。这点在 .NET 领域中是尤其重要的,因为您此时处理的只是所谓的非连接的数据集,并且客户应用程序(此例指浏览器)中所显示的缓冲数据仅是一个屏幕快照,而数据库中的实际记录可能已经被更改了。

如何选择依然取决于您,但只是要注意该选项所产生的结果。

图 3. Data Adapter Configuration 向导——commannd
图 3. Data Adapter Configuration 向导——command

现在,您可以单击 DataSet选项卡并选中 New DataSet选项来创建一个新的 DataSet(名为 dataSet1),用于填充 SQL SELECT 命令的输出结果。

如果您愿意,还可以单击 Preview Data选项卡来查看 SELECT 命令的结果。但必须单击 Refresh按钮来查看记录,同时您还可以任意限制设计时可视的行数(默认设置下为 100)。

一旦执行到这里,您就可以关闭 Data Adapter Configuration向导了。为了限制运行时被选中的记录数,您必须给 BdpDataAdapter 的 MaxRecords 属性指定一个值(默认设置下也为 100)。

在 Web 上显示数据
创建了连接后,还需要一个可视组件来显示数据。同上次一样,要用到 Web Control 类别中的 asp:DataGrid 组件。您需要将 DataSource 属性指向 dataSet1,将 DataMember 属性指向 Table1。如果在 DataMember 属性组合框的下拉列表中没有看到 Table1,就说明 SELECT 命令的结果还没有被填入 DataSet。为此,必须将 BdpDataSetAdapter组件的 Active属性设置为 True

然后您可以单击 asp:DataGrid 的动词 Auto Format来选择一种模式,比如我经常使用的 Professional 1。

在编译并运行此应用程序来查看实际输出之前,您必须先确保数据已经绑定到 asp:DataGrid 上。该绑定需要在运行 ASP.NET 的 Page_Load 事件处理程序时完成。双击 Web Form可弹出 Page_Load事件的代码编辑器,您需要在其中编写如下代码:


            private void Page_Load(object sender, System.EventArgs e)
            {
            // Put user code to initialize the page here
            if (!IsPostBack)
            dataGrid1.DataBind();
            }

这样就可以保证运行 ASP.NET Web 应用程序时能显示数据。注意, if 语句中检验 IsPostBack 的值,以确保 DataBind 方法仅在第一次调用。

在 Web 上编辑数据
上次,我给 asp:DataGrid 控件增加了按列排序的功能并提供了分页支持。然而这次,我希望在 asp:DataGrid 中添加编辑或删除数据的功能(插入功能将在下次涉及)。为了实现这一点,您首先必须给 asp:DataGrid 控件本身添加用于 edit、update、cancel 和 delete 命令的按钮。

单击 asp:DataGridProperty Builder动词(或右击它然后选择 Property Builder 选项)。在此对话框中,您可以控制在 asp:DataGrid 中真正显示哪些列。默认情况下,记录中的每一个字段将变成 asp:DataGrid 中的一列。然而有时候,您不需要查看所有字段,或者希望将某些字段标记为 read-only(例如关键字段 EMPNO),或者希望给 asp:DataGrid 添加一个特殊的带有命令按钮的列——见图 4。

此例中,请转向 Columns区域(在左边的列表中),并取消选中 Createcolumns automatically at run-time 选项,以使您能够手控要显示的列。现在,将 available columns 列表中所有您需要的字段移至 selected columns 列表中。在 available columns 列表的下面,您可以得到一些“特殊”的列,如 Button Column、HyperLink Column 以及 Template Column。

图 4. DataGrid Property Builder——添加特殊的列
图 4. DataGrid Property Builder——添加特殊的列

这里您需要添加一个 Button Column,其中包含 Edit、Update 和 Cancel 按钮。对于 Button Column,您可以指定按钮类型为 LinkButton 或 PushButton。我喜欢选择后者(再次见图 4)。您还可以指定用于 Edit、Cancel 和 Update 按钮上的说明——例如假若您要给荷兰的终端用户编写应用程序,这样就很灵活。

控制编辑
虽然现在已经添加了 Edit、Update 和 Cancel 按钮,并且能在 asp:DataGrid 中显示出来,但却不会响应我们的单击。若要它们能够响应单击,还必须实现 asp:DataGrid 组件的三个事件处理程序:EditCommand、CancelCommand 和 UpdateCommand。

在 EditCommand 事件处理程序中,必须给 asp:DataGridEditItemIndex 属性赋值为指向您所单击的行。我们会发现此行的索引其实就是事件参数中的 Item.ItemIndex 值。设置完 EditItemIndex 属性后,还要再次将数据绑定到 asp:DataGrid ,这样就能用 TextBox 控件来显示被选中的行了。


            private void dataGrid1_EditCommand(object source,
            System.Web.UI.WebControls.DataGridCommandEventArgs e)
            {
            dataGrid1.EditItemIndex = e.Item.ItemIndex;
            dataGrid1.DataBind();
            }

CancelCommand 事件处理程序的实现就更加容易了:这次您只需要将 -1 赋给 EditItemIndex 属性,表示当前正在编辑此行。


            private void dataGrid1_CancelCommand(object source,
            System.Web.UI.WebControls.DataGridCommandEventArgs e)
            {
            dataGrid1.EditItemIndex = -1;
            dataGrid1.DataBind();
            }

而对于 UpdateCommand 的实现就有点棘手了。这次,需要从 TextBoxes (在 asp:DataGrid 内部)中获取数据来构建您自己的 update 语句。为此,您可以将单元格中的控制交给 TextBox 控件,并获取其 Text 属性然后存储到临时字符串变量中(仅仅为了能表示清楚,所以我将这些变量名设为记录中的字段名称)。

一旦获得 TextBoxes 中所有的值,您就可以创建一个新的 BdpCommand 并动态地构造 SQL UPDATE 语句,以确保为字符串字段(和日期字段)将字段值放在引号内,而其他字段的值不放在引号内。BdpCommand 组件中的 ExecuteNonQuery 方法会将 UPDATE 语句发送给 DB2 UDB。在 DB2 UDB 中将成功执行该语句,否则返回一个异常(下次,我将演示当给 UpdateCommand 方法还添加输入验证时如何处理异常)。


            private void dataGrid1_UpdateCommand(object source,
            System.Web.UI.WebControls.DataGridCommandEventArgs e)
            {
            bdpDataAdapter1.Active = false;
            // retrieve the data from the asp:DataGrid
            string EMPNO = ((TextBox)e.Item.Cells[0].Controls[0]).Text;
            string FIRSTNME = ((TextBox)e.Item.Cells[1].Controls[0]).Text;
            string MIDINIT = ((TextBox)e.Item.Cells[2].Controls[0]).Text;
            string LASTNAME = ((TextBox)e.Item.Cells[3].Controls[0]).Text;
            string WORKDEPT = ((TextBox)e.Item.Cells[4].Controls[0]).Text;
            string PHONENO = ((TextBox)e.Item.Cells[5].Controls[0]).Text;
            string HIREDATE = ((TextBox)e.Item.Cells[6].Controls[0]).Text;
            string JOB = ((TextBox)e.Item.Cells[7].Controls[0]).Text;
            string EDLEVEL = ((TextBox)e.Item.Cells[8].Controls[0]).Text;
            string SEX = ((TextBox)e.Item.Cells[9].Controls[0]).Text;
            string BIRTHDATE = ((TextBox)e.Item.Cells[10].Controls[0]).Text;
            string SALARY = ((TextBox)e.Item.Cells[11].Controls[0]).Text;
            string BONUS = ((TextBox)e.Item.Cells[12].Controls[0]).Text;
            string COMM = ((TextBox)e.Item.Cells[13].Controls[0]).Text;
            Borland.Data.Provider.BdpCommand command = new Borland.Data.Provider.BdpCommand();
            command.Connection = bdpConnection1;
            bdpConnection1.Open();
            // build our own SQL Update statement
            command.CommandText = "UPDATE ADMINISTRATOR.EMPLOYEE SET " +
            "FIRSTNME = '" + FIRSTNME + "', " +
            "MIDINIT = '" + MIDINIT + "', " +
            "LASTNAME = '" + LASTNAME + "', " +
            "WORKDEPT = '" + WORKDEPT + "', " +
            "PHONENO = '" + PHONENO + "', " +
            "HIREDATE = '" + HIREDATE + "', " +
            "JOB = '" + JOB + "', " +
            "EDLEVEL = " + EDLEVEL + ", " + // no string
            "SEX = '" + SEX + "', " +
            "BIRTHDATE = '" + BIRTHDATE + "', " +
            "SALARY = " + SALARY + ", " + // no string
            "BONUS = " + BONUS + ", " + // no string
            "COMM = " + COMM + " " + // no string
            "WHERE EMPNO = '" + EMPNO + "'";
            // execute our own SQL Update statement
            command.ExecuteNonQuery();
            bdpDataAdapter1.Active = true;
            dataGrid1.EditItemIndex = -1;
            dataGrid1.DataBind();
            }

当 update 操作执行成功时,BdpDataAdapter 能再次被激活,并会将数据重新绑定到网格上,以使所做的修改可见。

请注意我只在 WHERE 子句中传递了 EMPNO 的值,而不像前面讨论的一样包括所有原始字段的值(请回忆 DataAdapter Configuration 对话框中的 Optimize 选项)。

删除记录
既然能编辑记录,就能够取消编辑或应用更新。但如果还能删除整条记录就更好了。为了实现该功能,还必须再次执行两个步骤。第一步就是用 asp:DataGrid Property Builder 添加一个新的 Button Column,这次是用于 Delete 命令。您同样也能指定该命令的说明和类型(button 或 link)。

第二步就是处理按钮单击的实现,这将在 asp:DataGrid 组件 的 DeleteCommand 事件处理程序中完成。其参数也包含了 Item.ItemIndex ,但这次您不能从 TextBox 中获取 EMPNO 字段的值(因为这里没有可用的 TextBox)。

但可通过 Property Builder 的 General 页中的 Data key field 组合框告知 asp:DataGrid 本身有哪些关键字段。如果您将该组合框设置为 EMPNO,那么 asp:DataGrid 的 DataKeys 属性将保留有该键值。通过正确的索引( e.Item.ItemIndex ),您就可以得到正确的键值用于 DELETE 命令的 WHERE 子句中。


            private void dataGrid1_DeleteCommand(object source,
            System.Web.UI.WebControls.DataGridCommandEventArgs e)
            {
            bdpDataAdapter1.Active = false;
            // retrieve the data from the asp:DataGrid
            string EMPNO = (string)dataGrid1.DataKeys[e.Item.ItemIndex];
            Borland.Data.Provider.BdpCommand command = new Borland.Data.Provider.BdpCommand();
            command.Connection = bdpConnection1;
            bdpConnection1.Open();
            // build our own SQL Update statement
            command.CommandText = "DELETE FROM ADMINISTRATOR.EMPLOYEE " +
            "WHERE EMPNO = '" + EMPNO + "'";
            // execute our own SQL Update statement
            command.ExecuteNonQuery();
            bdpDataAdapter1.Active = true;
            dataGrid1.DataBind();
            }

如果您并不希望真正从 DB2 UDB SAMPLE 数据库表中删除记录,就将 command.ExecuteNonQuery() 调用置于注释中并将 command.CommandText 的值赋给 asp:label 组件,该组件就在 asp:DataGrid 之上。除了使用测试数据库之外,这是在“实时”执行前测试代码的最安全的方法。

在下图中可看到带有 edit 和 delete 按钮的 DataGrid(如您所见,限制 asp:DataGrid 中可见的列数或许是个好办法):

图 5. 带有 asp:DataGrid 以及 Edit、Delete 按钮的 ASP.NET Web 应用程序
图 5. 带有 asp:DataGrid 以及 Edit,Delete 按钮的 ASP.NET Web 应用程序

当用户单击 Edit按钮时,该按钮将会被替代为一个 Update 和一个 Cancel 按钮,且所有没有被标记为 read-only 的字段都将在其单元格中获得一个 TextBox 控件。在下篇文章中,我将展示如何扩展简单控件 TextBox 带有输入验证功能以获得更多控制能力或更加用户友好的应用程序。

图 6. 带有 asp:DataGrid 和 Update、Cancel 以及 Delete 按钮的 ASP.NET Web 应用程序
图 6. 带有 asp:DataGrid 和 Update,Cancel 以及 Delete 按钮的 ASP.NET Web 应用程序

单击 Cancel按钮后,将会忽略所有所做的修改。而如果单击 Update按钮,则会执行构造 UPDATE 命令的代码。

如上一清单所示,Delete 按钮将创建 DELETE 命令。

部署应用程序
部署 ASP.NET Web 应用程序是指将其置于一个能访问 DB2 UDB SAMPLE 表的 Web 服务器上(该服务器应已安装 DB2 客户机)。为了部署当前的样本应用程序,需要用到 web.config、global.asax 和 WebForm1.aspx 这些文件(包含了用于 ASP.NET Web Form 的 HTML)。当然,您还需要部署 Bin 子目录中生成的 DB2UDB.dll 程序集(此例工程生成的结果),其中包含了 ASP.NET Web Form 中已编译的 Code Behind 部分。

除了该工程特有的文件之外,还需要部署 Borland Data Provider 文件,其中包括 bdpdb2.dllbdpdb2.dll 必须置于搜索路径中,或者更容易地将之置于部署了 DB2UDB.dll 的 Bin 目录中。

三个 BDP 程序集( Borland.Data.Provider.dllBorland.Data.Common.dllBorland.Data.Db2.dll )与 Code Behind 文件放置在相同的目录下,或者使用 gacutil 部署在 Global Assembly Cache 中。后种情形下,它们将在您的 .NET Web 服务器上被共享并且还能被 ASP.NET 应用程序的其他 BDP 使用。

结束语
在本文中,我展示了 DB2 UDB 作为一个功能强大的 DBMS 如何创建 ASP.NET Web Forms,在该应用程序中可使用 Borland Data Providers for .NET 来访问或修改(使用 edit、cancel、update 或 delete)DB2 UDB SAMPLE 数据库中的数据。

通过使用 Win Forms 或 ASP.NET Web Forms, Borland RAD 工具和 DB2 UDB 可以连接到 .NET 上,由此产生的强大组合可用于处理 DB2 UDB 表中的数据。

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