中国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 Web 页面上的 DB2 数据库表
作者:佚名 时间:2005-09-08 19:25 出处:互连网 责编:小渔
              摘要:使用 Delphi for .NET 处理 ASP.NET Web 页面上的 DB2 数据库表
Bob Swart
顾问,Bob Swart Training & Consultancy
2004 年 3 月
本文展示了如何使用 Borland Delphi 8 for the Microsoft .NET Framework 来构建连接到 IBM DB2 Universal Database 表的 ASP.NET Web 应用程序;在特殊的 ASP.NET DataGrid 控件中显示数据;以及编辑、应用或撤销在这些数据库表中进行的修改。

简介
在这篇文章中,我将演示如何可以使用 Borland® Delphi TM8 for the Microsoft® .NET Framework(以下缩写为“Delphi 8 for .NET”)来构建连接到 IBM® DB2® Universal Database TM(UDB)表的 ASP.NET Web 应用程序;在 ASP.NET DataGrid 控件中显示数据;以及编辑、应用或撤销在这些数据库表中进行的修改。我将采用 Borland Data Provider(BDP)for ADO.NET 作为数据访问技术,并且使用“普通的”的 ASP.NET 控件和新的 Borland DB Web 控件在 ASP.NET Web 页面内显示数据。

构建 ASP.NET Web 页面
Delphi 8 for .NET 包含了对 ASP.NET 的完全支持,包括 ASP.NET Web 服务(另一次的主题)和 ASP.NET Web Forms。通过 File | New - ASP.NET Web Application,您可以启动一个新的 ASP.NET Web Forms 应用程序。在这之后,您需要指定新项目的名称和位置:

图 1. 新建 ASP.NET Web 应用程序
图 1. 新建 ASP.NET Web 应用程序

这将在与其同名的虚拟目录中产生一个名为 D8DB2SAMPLE 的新项目,意味着您可以在开发机器上的 http://localhost/D8DB2SAMPLE 里查看项目结果(我将在本文的末尾介绍实际的部署步骤)。

Delphi 8 for .NET IDE 现在将使用专用的 HTML Designer 来支持您设计 ASP.NET Web Forms。工具板(tool palette)列出了 Components、Data Components、Borland Data Provider、DB Web、Enterprise Core Objects、HTML Elements 和 Web Controls 类别中的各个组件。现在,您将要使用 Borland Data Provider、DB Web 和 Web Controls 类别中的组件,先从 BDP controls 开始。

用 Borland Data Provider 进行连接
Data Explorer 在 Delphi 8 for .NET IDE 中总是可用的(即时没有打开的项目),您可以使用它来打开到 DB2 SAMPLE 数据库的连接并且显示该 DB2 UDB 中的表、视图或存储过程。请查阅我所写的关于 Delphi 8 for .NET 和 IBM DB2 连接细节的 第一篇文章。

图 2. Borland Data Explorer
图 2. Borland Data Explorer

您可以将 Data Explorer 中的 ADMINISTRATOR.EMPLOYEE 表节点(在 IBM DB2 SAMPLE 数据库连接树中)拖至 HTML designer 区域。这将在 HTML Designer 的非可视组件区域里产生一个 BdpConnection 和一个 BdpDataAdapter 组件。BdpConnection 组件将连接 DB2 UDB SAMPLE 数据库,而 BdpDataAdapter 组件则会通过 SELECT、UPDATE、DELETE 和 INSERT SQL 命令在 .NET DataSet 和 DB2 SAMPLE 数据库本身之间充当一个“适配器”。

要定制对 BdpDataAdapter 组件的设置,单击 Object Inspector上的动词 Configure the DataAdapter,这将启动 Data Adapter Configuration对话框(见图 3 和下面各图)。

图 3. Data Adapter Configuration - Command
图 3. Data Adapter Configuration - Command

通过 Tables 和 Columns 列表框,您可以创建自己的用于 SELECT、UPDATE、INSERT 和 DELETE SQL 命令中的字段集合。本例中,我将恰好选择 ADMINISTRATOR.EMPLOYEE表中的所有字段。

一旦对 SELECT语句感到满意,您就可以进入 DataSet选项卡以指定将 SELECT 语句的结果置于何处 - 将 DataTable 放入新的或现有的 .NET DataSet 中,例如:

图 4. Data Adapter Configuration - DataSet
图 4. Data Adapter Configuration - DataSet

现在,您可以关闭 Data Adapter Configuration对话框,然后返回 Delphi for .NET了。WebForm 设计器的非可视组件区域中现在拥有三个组件: BdpConnectionBdpDataAdapterDataSet。当您通过将其 Active 属性设置为 True而激活 BdpDataAdapter组件时,Delphi 将在 .NET DataSet内创建一个名为 EMPLOYEE的新表,而接下来的小节中将对该表进行处理。

使用 ASP.NET DataGrid 处理 DB2 数据
现在,您可以使用标准的 ASP.NET DataGrid 控件开始处理 DB2 Employee 数据集(dataset)内的数据了。该组件可以在 Tool PaletteWeb Controls类别中找到。双击该组件以将其放置在 HTML Designer里的 Web form 上(在流式布局中)。将其 DataSource 属性赋值为 dataSet1DataMember属性赋值为 EMPLOYEE(容纳 SELECT 命令结果的 DataTable 名称)。现在 HTML Designer 中的 DataGrid 将显示列名以及基于字段类型的样本值(即字符串字段为“abc”,日期类型为“2003-12-29 00:00:00”等等)。但是不会显示任何真正的记录值。您可以用 Object Inspector 中的 Auto Format 动词定制 DataGrid 的样式。我通常将之设置为 Professional 1(但您当然也可以在这里进行自己的选择)。

分页、编辑、删除等
要真正处理数据,您还需要单击 DataGrid的动词 Property Builder。在 DataGrid Properties对话框的第一个页面上(图 5),您可以指定数据关键字段(设置为 EMPNO)。这将用作 SQL DELETE命令中的关键字,而您马上就会生成该命令。在该对话框上,您还可以启动排序,虽然这样会使您需要实现 DataGrid 的 SortCommand 事件处理程序(我在 2003 年 10 月的那篇文章中使用 C#Builder 完成了该工作,而今天就不再介绍了。您可以通过 C#Builder 文章中的步骤自己随意加以实现)。

图 5. DataGrid Property Editor - General
图 5. DataGrid Property Editor - General

下一步就是进入 DataGrid Property Editor对话框的 Column页。这里,您首先需要取消 Create columns automatically at run-time选项,然后您可以手工选择所必须创建的列。除了选择数据列,您也许还希望显示特殊的 edit/update/cancel 和 delete 按钮。这些可以在 available columns 列表的末尾找到(见图 6)。

图 6. DataGrid Property Editor - Columns
图 6. DataGrid Property Editor - Columns

对于每个按钮,您可以指定按钮的类型(link 或 pushbutton)和所使用的实际标题。您将需要实现 EditCommandCancelCommandUpdateCommandDeleteCommand以使这四个新按钮完成它们的工作。

然而在可以这样做之前,您必须先进入 DataGrid Property Editor对话框的 Paging页面并且启用 allow paging选项。然后,您可以指定页面大小(默认为每页 10 条记录),以及导航按钮的类型(next and previous buttons 或 page numbers);见图 7。

图 7. DataGrid Property Editor - Paging
图 7. DataGrid Property Editor - Paging

要让导航按钮工作,您需要马上实现 PageIndexChange命令。由于这是您需要做的最后的更改,所以现在就关闭 DataGrid Property Editor对话框并开始实现您已启用的所有事件。

实现 ASP.NET DataGrid 事件
选择 ASP.NET DataGrid组件,然后进入 Object InspectorEvents页面。让我们从 分页功能开始,因此请双击 PageIndexChanged事件处理程序,并编写下列代码用以给 DataGridCurrentPageIndex属性赋新值:


            procedure TWebForm1.DataGrid1_PageIndexChanged(source: System.Object;
            e: System.Web.UI.WebControls.DataGridPageChangedEventArgs);
            begin
            dataGrid1.CurrentPageIndex := e.NewPageIndex;
            dataGrid1.DataBind // refresh data
            end;
            

接下来,通过给 DataGridEditItemIndex属性赋值来实现 EditCommandCancelCommand。将该属性设置为 0 或更高的值将会使 DataGrid 中的那一行被置于编辑模式。要重新删除编辑模式,您可以将 EditItemIndex设置为 -1。


            procedure TWebForm1.DataGrid1_EditCommand(source: System.Object;
            e: System.Web.UI.WebControls.DataGridCommandEventArgs);
            begin
            dataGrid1.EditItemIndex := e.Item.ItemIndex;
            dataGrid1.DataBind // refresh data
            end;
            procedure TWebForm1.DataGrid1_CancelCommand(source: System.Object;
            e: System.Web.UI.WebControls.DataGridCommandEventArgs);
            begin
            dataGrid1.EditItemIndex := -1;
            dataGrid1.DataBind // refresh data
            end;
            

现在是时候实现 UpdateCommand事件处理程序了。有多种方法可完成该工作,但通常都包含构建一个定制的 SQL 命令,作为 update 语句用于 EMPLOYEE表。


            procedure TWebForm1.DataGrid1_UpdateCommand(source: System.Object;
            e: System.Web.UI.WebControls.DataGridCommandEventArgs);
            const
            MyFields = 14;
            var
            MyFieldData:
            Array [0..MyFields-1] of String;
            i: Integer;
            command: BdpCommand;
            begin
            bdpDataAdapter1.Active := False;
            // retrieve the data from the asp:DataGrid
            for i:=0
            to MyFields-1
            do
            MyFieldData[i] := (e.Item.Cells[i].Controls[0]
            as TextBox).Text;
            command := BdpCommand.Create;
            command.Connection := bdpConnection1;
            bdpConnection1.Open();
            // build our own SQL Update statement
            command.CommandText := 'UPDATE ADMINISTRATOR.EMPLOYEE SET ' +
            //  'EMPNO = ' + MyFieldData[0] + ', ' +
            'FIRSTNME = '' + MyFieldData[1] + '', ' +
            'MIDINIT = '' + MyFieldData[2] + '', ' +
            'LASTNAME = '' + MyFieldData[3] + '', ' +
            'WORKDEPT = '' + MyFieldData[4] + '', ' +
            'PHONENO = '' + MyFieldData[5] + '', ' +
            'HIREDATE = '' + MyFieldData[6] + '', ' +
            'JOB = '' + MyFieldData[7] + '', ' +
            'EDLEVEL = ' + MyFieldData[8] + ', ' +
            'SEX = '' + MyFieldData[9] + '', ' +
            'BIRTHDATE = '' + MyFieldData[10] + '', ' +
            'SALARY = ' + MyFieldData[11] + ', ' +
            'BONUS = ' + MyFieldData[12] + ', ' +
            'COMM = ' + MyFieldData[13] + ' ' +
            'WHERE EMPNO = '' + MyFieldData[0] + '';
            // execute our own SQL Update statement
            try
            command.ExecuteNonQuery;
            except
            on E: Exception
            do
            Response.Write(E.Message)
            end;
            bdpDataAdapter1.Active := True;
            dataGrid1.EditItemIndex := -1;
            dataGrid1.DataBind // refresh data
            end;
            

为了构建 DeleteCommandWHERE部分,您需要获取当前行的关键字段值。记得您是如何将 EMPNO字段指定为关键字段的(在 DataGrid 配置对话框中)。这意味着当单击 DataGrid中的 Delete按钮时,您可以使用事件参数的 itemindex 来指向 DataGridDataKey的值(相当于您所单击的那一行 EMPNO 字段的值)。然后,该值则会用于构造定制的 SQL DELETE语句,如下:


            procedure TWebForm1.DataGrid1_DeleteCommand(source: System.Object;
            e: System.Web.UI.WebControls.DataGridCommandEventArgs);
            var
            EMPNO: String;
            command: BdpCommand;
            begin
            bdpDataAdapter1.Active := False;
            // retrieve the data from the asp:DataGrid
            EMPNO := dataGrid1.DataKeys[e.Item.ItemIndex].ToString;
            command := BdpCommand.Create;
            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
            Response.Write(command.CommandText);
            try
            command.ExecuteNonQuery;
            except
            on E: Exception do
            Response.Write(E.Message)
            end;
            bdpDataAdapter1.Active := True;
            dataGrid1.DataBind // refresh data
            end;
            

最后,您应该确定在第一次显示页面时,DataGrid 真正显示在 Web form 上,而这可以在 Page_Load事件处理程序中完成。在 HTML Designer中双击 Web Form来实现该事件处理程序,并且编写下列代码:


            procedure TWebForm1.Page_Load(sender: System.Object; e: System.EventArgs);
            begin
            // TODO: Put user code to initialize the page here
            if not IsPostBack
            then
            dataGrid1.DataBind
            end;
            

在完成这一切代码之后,就到了启动 ASP.NET Web forms应用程序的时候了。这可以通过前面指定的 URL I:http://localhost/D8DB2SAMPLE/WebForm1.aspx 或从 Delphi 8 for .NET IDE 本身执行 Run | Run来完成。

图 8. 运行中的 ASP.NET DataGrid
图 8. 运行中的 ASP.NET DataGrid

您可以使用 DataGrid 脚注里的页号从一页翻到另一页,以及使用 Edit 按钮以将 DataGrid 设置为编辑模式(这之后将出现 Cancel 和 Update 按钮)。Delete 按钮将从 DataGrid 删除一条记录。如果发生错误(例如删除记录时违反了参照完整性),Update 和 Delete 按钮则使用异常处理程序来显示出错消息。

使用 DB Web 控件处理 DB2 数据
现在,您可以使用新的 Borland DB Web 控件开始处理 DB2 Employee数据集(dataset)内的数据了。在 Delphi 8 for .NET 的 Enterprise and Architect 版本中可获得这些控件(然而只有这些版本在 Borland Data Provider for .NET 中包含了 DB2 驱动程序,因此大家应该还是能够继续完成下去的)。

正如 Borland Data Provider 提供了对于 ADO.NET 的增强,DB Web 控件也提供了对一些普通的 ASP.NET 控件的有效增强,比如目前您一直在使用的 DataGrid。

您可以从 Web Form 删除 ASP.NET DataGrid,或者向 ASP.NET Web 项目添加另一个 Web Form(在这种情况下,您需要重新将 EMPLOYEE 拖至新的页面上)。在这两种情况下,您都需要进入 Tools PaletteDB Web类别。在这里,您将找到许多将 DBWebDataSource 组件用作 .NET DataSet 和 DB Web 数据感知控件之间连接器的控件。首先在 Web Form上放入 DBWebDataSource控件,然后将其 DataSource属性连接到 dataSet1(容纳 DB2 SAMPLE 数据的 EMPLOYEE DataTable 的 .NET DataSet)。

现在,放入一个 DBWebGrid组件 - 从 ASP.NET DataGrid 派生的特别版。将其 DBDataSource属性指向 DBWebDataSource组件,然后选择 EMPLOYEETableName属性的值。现在,您应该看到设计时的“实时数据”了!

图 9. 显示了设计时数据的 DB Web Grid
图 9. 显示了设计时数据的 DB Web Grid

您或许没有被这个小小的功能打动,但是它肯定十分有用(我个人很欢迎在设计时的任何一天查看 Web forms 的功能)。

您可以使用 Auto Format动词来设置 DBWebGrid的样式 - 就像对于常规的 ASP.NET DataGrid 组件一样。当您选择配色方案时,你可能会注意到 DBWebGrid 的第一行看起来似乎已经处于编辑模式中了。实际也的确如此。DBWebGrid 已经内置了对 Edit、Cancel、Update 和 Delete(还有 Paging)的支持。您只需要通过放置 DBWebNavigator 组件来使之更加可见 - 例如,就是上面的 DBWebGrid 控件。您需要再次将 DBWebDataSource 属性指向 DBWebDataSource 组件并且将 MPLOYEE设置为 TableName 属性的值。

此外,您只需要编写一行代码以实现将 DBWebGrid 中的修改数据重新应用到 DB2 UDB SAMPLE 数据库中(在所谓的“Apply To Server”动作中)。这可以通过在 DBWebDataSource 组件的 ApplyChangesRequest 事件处理程序中调用 BdpDataAdapterAutoUpdate 方法来完成:


            procedure TWebForm1.DBWebDataSource1_OnApplyChangesRequest(
            sender: System.Object; e: Borland.Data.Web.WebControlEventArgs);
            begin
            BdpDataAdapter1.AutoUpdate
            end;
            

请注意,这与我在 第一篇 Delphi 8 for .NET 文章中所做的是相同的。

除了这一行代码,您无需再编写任何其他东西。DBWebGrid 十分“智能”,足以在控件处于编辑模式时捕捉其中所进行的修改并将之置于 DataSet 控件中。.NET DataSet 通过 DBWebNavigator 控件中的“Undo”和“Undo All”按钮提供了撤销修改的功能(请参阅 上次的文章)。

当您运行应用程序时,修改一些数据然后单击 Apply To Server按钮,您可能会看到一个对话框,告诉您 ADMINISTRATOR.ADMINISTRATOR.EMPLOYEE是一个未定义的名字。无需担心什么:由于 BdpDataAdapter 的 AutoUpdate 方法将用户名 ADMINISTRATOR 加在了表名之前,所以产生了 ADMINISTRATOR.ADMINISTRATOR.EMPLOYEE。您必须编辑 BdpDataAdapter 的 SQL SELECT命令并且从中删除前缀 ADMINISTRATOR,如图 10 所示。

图 10. 从表名中删除 ADMINISTRATOR
图 10. 从表名中删除 ADMINISTRATOR

这将确保 AutoUpdate 语句生成正确的名称。

最后的图 11 展示了从 DB2 UDB SAMPLE 数据库连接到 EMPLOYEE 表的 DBWebGrid 组件,您可以使用配备的导航器(navigator)来浏览网格(grid)、编辑记录、对服务器应用更新、删除记录,等等。

图 11. 在 ASP.NET Web Form 中编辑 DB2 UDB SAMPLE 数据库
图 11. 在 ASP.NET Web Form 中编辑 DB2 UDB SAMPLE 数据库

请注意如果您感觉 DBWebGrid 占用了太多空间,那么您随时可以使用 Property Editor 来从显示中删除一些字段。

部署 BDP ASP.NET Web 应用程序
虚拟目录 D8DB2SAMPLE 中最终的 ASP.NET Web 应用程序包含了几个文件,但是您只需部署其中一些。您需要 bin 子目录中的 D8DB2SAMPLE.dll 程序集,虚拟目录本身中的 WebForm1.aspx文件,以及(可选) globals.asaxweb.config文件。所有其他的源文件(或已编译的单元)都不需要进行部署。

此外,您还需要部署 BDP 驱动程序。Borland Data Provider 包含通过强键注册的程序集,并且最好是部署在 Global Assembly Cache(GAC)中。具体地说,您需要部署 Borland.Data.Provider.dllBorland.Data.Common.dllBorland.Data.Db2.dll ,并且还需要确定也能够找到 bdpdb2.dll Win32 DLL,因为它将链接 db2cli.dll 中的 DB2 客户机。

三个 Borland.Data 程序集既可放置在与执行客户机相同的目录中(这样就只有客户机应用程序可看到和使用它们),也可以使用 gacutil 命令行实用工具部署在 Global Assembly Cache 中。后种情形下,它们将在您的 .NET Web 机器上被共享并且还能被其他的 .NET 应用程序使用。

Borland DB Web 控件可以在 Borland.Data.Web.dll 程序集中找到,而您的 ASP.NET 项目可以自由地部署这些程序集。请注意,Delphi 8 for .NET(Enterprise and Architect)甚至包含了这些控件的 C# 源代码。

结束语
在这篇文章中,我展示了 IBM DB2 UDB 是一个功能强大的 DBMS,而 Delphi 8 for .NET 可以通过标准的 ASP.NET 控件(如 DataGrid)或新的 Borland DB Web 控件(包括 DBWebGrid 和 DBWebNavigator 控件)来将其用于构建 ASP.NET Web form 应用程序。

Delphi 8 for .NET 和 IBM DB2 UDB 的结合提供了真正的 RAD 方法以构建功能强大、数据驱动的 ASP.NET Web 应用程序。

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