初学ADO.NET手记2(Data命名空间)

3、视图

 

       视图与表在ADO.NET中比较容易混淆,因其具有类似的操作。如视图与表都可以进行修改、更新、新增,其实CRUD这四个操作对视图与对表都是相同的,不同的是:视图是在表基础上的定义,可以定义多个视图,从不同的角度观察一个表;视图是操作DataViewRow,而表是操作DataRow。另外注意每个DataTable均有个DefaultDataView,每个DataSet均有个DefaultDataViewManager

DefaultDataViewManager属性包含 DataSet 中每个 DataTable 的默认 DataViewSettingCollection。而DataViewSetting表示从 DataViewManager 创建的 DataView ApplyDefaultSortDataViewManagerRowFilterRowStateFilterSort Table 的默认设置。可见,视图与PB等比较,可以将状态作为过滤器,比PB的利用缓冲区来跟踪更新要高明些。

例:

    DataView    dv = new DataView(custTable);//在custTable基础上建view

 

    dv.RowStateFilter = DataViewRowState.ModifiedOriginal;//只显示更新的原始记录

 

    DataRowView drv = dv.AddNew();//在视图中加上一行

 

    Drv.BeginEdit();//必须加此行,否则不会确认修改

 

Drv[“item”] = “fish”;//该行item属性为“fish”

 

Drv.EndEdit();//保存修改到DataTable中去

 

   

 

4、视图和表的比较

 

    视图允许:AllowDelete、AllowEdit、AllowNew属性。表不允许。

 

    视图允许:RowFilter、RowStateFilter、Sort属性。表不允许。

 

    视图允许:Find、FindRows方法。表不允许。

 

行:表为DataRow,视图为DataViewRows。而DataTable中有个Rows属性,DataView没有。

 

更新:DataTable:AcceptChanges方法;

 

DataRow:AcceptChanges、BeginEdit、EndEdit、CancelEdit 、RejectChanges方法;

 

DataView:只能通过保存每个DataViewRow来保存;

 

DataRowView: DataRowView都有BeginEdit、EndEdit、CancelEdit方法。

 

 

 

5、“触发器”----事件

 

       与一行记录有关的:RowChangedRowChangingOnRowDeletingOnRowDeleted。由DataRowEventArgs提供数据。

       与某列记录有关的:ColumnChangingColumnChanged。由DataColumnEventArgs提供数据。

5.1 列更新

 

       public event DataColumnChangeEventHandler ColumnChanging

3(接例1):

       private void AddRecord{

//事件分配

custTable.ColumnChanging += new DataColumnChangeEventHandler( Column_Changing );

       //加十条记录

      for (int id=0; id<10 id++)

       {

              custTable.Rows.Add(new object []{id,string.Format(“name{0}”,id),stringFormat(“address{0}”,id)};

       }

       //确认

       custTable.AcceptChanges();      

//改变记录

       foreach (DataRow row in custTable.Rows)

       {

              row[“name”] = string.Format(“vip{0}”,row[“id”]);

       }

       //事件处理

       private static void Column_Changing(Object o,DataColumnEventArgs e)

       {   //注意e的应用

              Console.WriteLine( "Column_Changing Event: name={0}; Column={1}; proposed name={2}", e.Row["name"], e.Column.ColumnName, e.ProposedValue );

       }

5.2 行更新

 

       就不举例了。

 

 

6、事务

 

DataTableAcceptChanges方法;

 

DataRowAcceptChanges、BeginEdit、EndEdit、CancelEdit 、RejectChanges方法;

 

DataView:只能通过保存每个DataViewRow来保存;

 

DataRowView DataRowView都有BeginEditEndEditCancelEdit方法。

 

 

7、异常

 

约束:ConstraintException……

 

 

8、疑问

 

8.1 并发控制

 

由于DataSet封装了真实DBMS,在提高了面向对象特征的同时,也必须自己实现并发控制----开放式并发控制。这个方法在微软MSDN技术资源库的《设计数据层组件并在层间传递数据》中已讲得非常清楚,这种机制比起数据库的封锁机制显得太简单,并会引发一些问题:AB同时更改一条记录RA先读出RB再读出同一条RA回写RAB回写时发现R已改变,这时B该怎么办?是写一条新记录,还是覆盖RARB?全乱套了。DBMS可以这样处理:A要更改R,则给R加上X锁,B根本读不出来,只有当A回写RA后,才能读出,这时B由于不能读出R,当然也不能更改R

写到这里忽然想起:PB中的DataWindow类似于DataSet啊,为何……哦,PB一般是C/S架构,在Client端,每个用户都有自己的DataWindow,当然不存在并发性问题。那么《设计数据层组件并在层间传递数据》一文为何要提出DataSet实现并发控制呢?是不是Web程序比较特殊,在Server端的DataSet需要控制并发?

以后学Web应用的时候,一定要给自己一个答案。

8.2 关于效率问题

 

记住:DataSet的主要目的是封装数据库,并与视图层(如DataGrid)、控制层(如数据处理程序)进行交互。在这个层面上,较少涉及到大的数据操作。如:在一个几十亿行的数据表A中查找数据集A1、或两个几万行的表AB连接后再查找数据集AB1,如果用DataSet代替AB表,效率可想而知。恰恰相反,DataSet是建立在A1AB1上的。是不是可以把它看作MVC中的M

即:由于DataSet需要将数据读入内存,因此千万不能读入大批数据,占用I/O资源。只需要在选取需要的数据即可。

也正因为如此吧,DataSet装载的多半是结果类型的数据,也难于实现变化的需求。这正是BI的优点。

8.3 OODBMSRDBMS

 

这里只是笑谈,我不了解OODBMS

DBMS的角度来看,DataSet中的表都是视图。在RDBMS中只需要一句实现的东东:如select t1.col3,t2.col4 from table1 t1 inner join table2 t2,在ADO.NET中就要写上N段代码。如果加上left join等,那就更麻烦了。

OODBMS如果完全坚持OO思路,可能也是一句话:X=inner(t1,t2).select(col3,col4),呵呵。

今天就到这里,过几天再总结Data.SqlClient命名空间。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值