i.Posei's blog

Happiness only real when shared!
posts - 53, comments - 251, trackbacks - 0, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

理解DataSet的数据缓存机制

Posted on 2006-02-10 20:26 i.Posei 阅读(2169) 评论(8)  编辑 收藏 网摘 所属分类: 数据库相关

虽然在以前的开发中经常使用DataSet类,但是重来没有涉及到数据缓存机制这块内容。今天看了一下,也算是做点总结。

在理解数据缓存机制之前需要理解DataRow的两个概念,即行状态行版本。行状态就是指DataRow的RowState属性,它可以的取值有Added、Deleted、Detached、Modified、Unchanged(含义可以在MSDN上查到),它用来描述数据行的状态,比如在删除某一行后,此行并不会本真正的被删除,因此它的行状态是Deleted;行版本有四种取值,分别是Current、Default、Original、Proposed,在对某一行的数据进行了修改后,该行数据就有了两个版本,分别是Original和Current。在调用AcceptChanges()或RejectChanges()方法之后,数据行的状态就会变为Unchanged。
现在应该可以理解
所谓的数据缓存机制了,它是指在添加、删除、修改数据后,DataSet中的数据并不会真正的被更改,直到调用AcceptChanges()后,这些数据才会被真正的更改。
下边给出一段代码说明含义。

{
   
//前边的代码实现了用DataAdapter填充DataSet类的实例:ds

   DataTable tbl_Customers 
= ds.Table["Customers"];

   DataRow myRow;
   
if (tbl_Customers.Rows.Count>0)
   
{
      myRow 
= tbl_Customers.Rows[0];

      
//输出修改前的行状态和行版本
      Debug.WriteLine("修改前");
      Debug.WriteLine(
" 行状态是:" + myRow.RowState.ToString());
      Debug.WriteLine(
" 该行CompanyName字段Original行状态是:" + myRow["CompanyName",DataRowVersion.Original]);
      Debug.WriteLine(
" 该行CompanyName字段Current行状态是:" + myRow["CompanyName",DataRowVersion.Current]);

      
//修改操作
      myRow["CompanyName"= "cnblogs.com";

      
//输出修改后的行状态和行版本
      Debug.WriteLine("修改后");
      Debug.WriteLine(
" 行状态是:" + myRow.RowState.ToString());
      Debug.WriteLine(
" 该行CompanyName字段Original行状态是:" + myRow["CompanyName",DataRowVersion.Original]);
      Debug.WriteLine(
" 该行CompanyName字段Current行状态是:" + myRow["CompanyName",DataRowVersion.Current]);

      
//确认修改
      myRow.AcceptChanges();

      
//输出确认修改后的行状态和行版本

      Debug.WriteLine(
"确认修改后");
      Debug.WriteLine(
" 行状态是:" + myRow.RowState.ToString());
      Debug.WriteLine(
" 该行CompanyName字段Original行状态是:" + myRow["CompanyName",DataRowVersion.Original]);
      Debug.WriteLine(
" 该行CompanyName字段Current行状态是:" + myRow["CompanyName",DataRowVersion.Current]);
}
上边代码的运行结果如下:
输出结果修改前:
  行状态是:Unchanged
  该行CompanyName字段Original版本值是:Alfreds Futterkiste
  该行CompanyName字段Current版本值是:Alfreds Futterkiste
修改后:
  行状态是:Modified
  该行CompanyName字段Original版本值是:Alfreds Futterkiste
  该行CompanyName字段Current版本值是:cnblogs.com
确认修改后:
  行状态是:Unchanged
  该行CompanyName字段Original版本值是:cnblogs.com
  该行CompanyName字段Current版本值是:cnblogs.com
由于DataSet的这一缓存机制,因此,在修改完毕后必须使用AcceptChages()确认修改或使用RejectChanges()拒绝修改才能真正生效!

Feedback

#1楼   回复  引用  查看    

2006-02-10 23:23 by 认真每一天      
不错呵呵

#2楼   回复  引用    

2006-02-11 04:01 by Shen126[未注册用户]
“行版本就是指DataRow的RowState属性,”
--这个是行状态吧?

#3楼   回复  引用    

2006-02-11 09:39 by hjf1223
事实上,你使用DataAdapter.Update() 更新你的DataSet的时候,这些状态才有最大的用武之处。
你的 “在修改完毕后必须使用AcceptChages()确认修改或使用RejectChanges()拒绝修改才能真正生效!” 这句话好像有点问题,修改后是会生效的,只是它还保存了原来的数据,调用了AcceptChages()只是把历史版本给清空了,调用RejectChanges()是恢复历史版本。

#4楼[楼主]   回复  引用  查看    

2006-02-11 10:13 by i.Posei      
@ Shen126
确实,我是Ctrl+V的,忘记改过来,已经改正,谢谢!
@ hjf1223
我这里的“真正生效”是指Original版本和Current版本的数据由不一样变为一样,使其不能在恢复到以前的状态!我写这文的时候只想把他限制在DataSet类分范围内,没考虑DataAdapter类。

#5楼[楼主]   回复  引用  查看    

2006-02-11 11:22 by i.Posei      
@ 认真每一天
thx

#6楼   回复  引用  查看    

2006-02-12 00:43 by 木野狐      
hjf1223 说的有道理。楼主你提的“不能真正生效”这个说法很牵强的。
对于使用者来讲,关注的只是 DataSet 里面的数据对外界表现的是什么样。也就是说最简单的你可以理解为用 DataSet.Tables[x].Rows[y]["字段名"] 取到的东西是不是生效了。而不是你所说的 Original 和 Current 版本必须一致才能够叫做“生效”。

#7楼   回复  引用  查看    

2006-02-14 16:42 by kid_li      
没有太多用过DataSet,因为很多人包括我自己都认为它效率低,而且占资源。但是也知道它的功能比较强大

#8楼[楼主]   回复  引用  查看    

2006-02-14 17:16 by i.Posei      
@kid_li
的确是有点占用资源,不过该用的时候还是要用啊!



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 328605




相关文章:

相关链接: