ObjectDataSoruce 系结 BusinessObject 控件

摘要
在 ASP.NET 中,ObjectDataSoruce 控件是实现三层式的重要关键,我们可以透过 ObjectDataSoruce 控件使用的自订中间层商务对象。不过一般找到的范例都是直接系结中间层商务对象,虽然范例通常写得相当符合对象导向,可是在实际运用上有下列几个问题。

问题一:维护性不佳
例如 Employee 商务对象的 Update 方法,可能有下列二种写法
[写法一] Update 方法中,每个字段皆为自变量
Public Function UpdateEmployee(EmployeeID As Integer, LastName As String, FirstName As String, _
                                   Address As String, City As String, Region As String, _
                                   PostalCode As String) As Integer
参考:http://msdn.microsoft.com/zh-tw/library/ms178538(VS.80).aspx
 
[写法二] Update 方法使用强型别,每个字段对应到类别的属性
Public Function UpdateEmployee(employee As NorthwindEmployee) As Integer
参考:http://msdn.microsoft.com/zh-tw/library/ms227562(VS.80).aspx
 
可是实际上真能这样用吗?以[方法一]为例,若异动字段非常多,Update 方法的自变量不就多到吓死人;[方法二]使用强型别可以解决字段多的问题,不过字段增减时,都需要同时维护 NorthwindEmployee 类别不是很麻烦吗?当你的系统非常庞大时,例如有上千个窗体,当这些窗体若需同时新增一个字段时,那就需要同时更新上千个对应的类别,可能会搞到你疯掉。
 
问题二:批次异动问题
当 GridView 系结 ObjectDataSource 在编辑一笔记录时储存时,有时我们并不希望该笔数据马上异动回数据库,也就是执行 ObjectDataSoruce 的 Update 方法,但数据不要真正写回数据库;而是所有编辑的数据先被暂存,最后执行一个方法(例如 Save),才将这些多笔数据的异动同时写回数据。而 ObjectDataSource 在处理这部分的问题,也很难完成。
 
问题三:Mater-Detail 问题
有些窗体具 Mater-Detail 的关系(如订单),可是 ObjectDataSource 很难描述这种关系,因为 ObjectDataSource 的角色相当于 DataTable,而 Mater-Detal 是多个 DataTable 的集合,相当于 DataSet。也就是说需要有多个 ObjectDataSource 才能描述 Master-Detal 的关系,而这些 ObjectDataSource 的异动不能马上写回数据库,窗体的编辑动作都需要被暂存,当按下储存时才能将整个 DataSet 的异动同时写回数据库。
 
TBBusinessObject 及 TBObjectDataSource 控件
针对以上的问题,在此使用另一种方式来处理,让 ObjectDataSource 系结 BusinessObject 控件,而 BusinessObject 控件提供 DataSet 属性,来暂存 ObjectDataSource 产生的异动。而呼叫真正的中间层商务对象时,再将 BusinessObject 控件的 DataSet 属性传入,由中间层商务对象去异动数据库。
以下范例以 GridView 系结 ObjectDataSource,当 GridView 进行修改、删除的动作时,会透过 ObjectDataSource 来呼叫 BusinessObject 控件来进行异动,而这此异动并不会被写回数据库,而是异动 BusinessObject 控件的 DataSet 属性。
一般的作法为
GridView --> ObjectDataSoruce --> 中间层 BusinessObject
而这边的作法为
GridView --> ObjectDataSoruce --> BusinessObject 控件 --> 中间层 BusinessObject



在页面上放置 TBBusinessObject 控件及 TBObjectDataSource 控件,在 TBObjectDataSource 控件设定 BusinessObjectID="TBBusinessObject1" 系结至 TBBusinessObject 控件。

             < bee:TBBusinessObject  ID ="TBBusinessObject1"  runat ="server" >
            
</ bee:TBBusinessObject >
            
< bee:TBObjectDataSource  ID ="TBObjectDataSource1"  runat ="server"  
                OldValuesParameterFormatString
="original_{0}"  RowIndex ="-1"
                TypeName
="Bee.Web.WebControls.TBBusinessObject"
                BusinessObjectID
="TBBusinessObject1"
                TableName
="Employee" >
            
</ bee:TBObjectDataSource >

当 Page Load 时产生的一个 Employee 的 DataTable,并将 DataTable 加入 TBBusinessObject.DataSet.Tables。在 GridView 执行 Update 及 Delete 时,要去设定 TBObjectDataSource 的 RowIndex,使用可以异动到对应的 DataRow。

Partial   Class _Default Class _Default
    
Inherits System.Web.UI.Page

    
Protected Sub Page_Load()Sub Page_Load(ByVal sender As ObjectByVal e As System.EventArgs) Handles Me.Load
        
If Not Me.IsPostBack Then
            
Dim oTable As Data.DataTable
            
Dim oColumn As Data.DataColumn
            
Dim oRow As Data.DataRow

            oTable 
= New Data.DataTable("Employee")

            oColumn 
= New Data.DataColumn("ID"GetType(String))
            oTable.Columns.Add(oColumn)
            oColumn 
= New Data.DataColumn("Name"GetType(String))
            oTable.Columns.Add(oColumn)
            oColumn 
= New Data.DataColumn("Tel"GetType(String))
            oTable.Columns.Add(oColumn)

            oRow 
= oTable.NewRow()
            oRow(
"ID"= "001"
            oRow(
"Name"= "張三"
            oRow(
"Tel"= "02-11111111"
            oTable.Rows.Add(oRow)

            oRow 
= oTable.NewRow()
            oRow(
"ID"= "002"
            oRow(
"Name"= "李四"
            oRow(
"Tel"= "02-22222222"
            oTable.Rows.Add(oRow)

            oRow 
= oTable.NewRow()
            oRow(
"ID"= "003"
            oRow(
"Name"= "王五"
            oRow(
"Tel"= "02-33333333"
            oTable.Rows.Add(oRow)

            TBBusinessObject1.DataSet.Tables.Add(oTable)
            GridView1.DataBind()
        
End If
    
End Sub


    
Protected Sub GridView1_RowCommand()Sub GridView1_RowCommand(ByVal sender As ObjectByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles GridView1.RowCommand
        
Select Case e.CommandName
            
Case "Update"
                TBObjectDataSource1.RowIndex 
= CInt(e.CommandArgument)
            
Case "Delete"
                TBObjectDataSource1.RowIndex 
= CInt(e.CommandArgument)
        
End Select
    
End Sub

End Class

执行程序,GridView 会透过 TBObjectDataSource 的来取得 TBBusinessObject 中的 Employee DataTable 并显示在 GridView 中。



按下编辑钮,针对数据列进行编辑


按下更新钮,异动就会被写回 TBBusinessObject 中的 Employee DataTable。

当按下删除钮时,TBBusinessObject 中的 Employee DataTable 的该笔 DataRow 也会被删除。



范例程序下程:BusinessObjectControl.rar

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值