zoukankan      html  css  js  c++  java
  • 理解DataSet的数据缓存机制

    虽然在以前的开发中经常使用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()拒绝修改才能真正生效!
  • 相关阅读:
    traceroute tracert 路由器地址 清单 192.168.2.1 网关路由器地址
    /usr/local/nginx/sbin/nginx -s reload 失败原因pid 进程记录和当前不符
    Nginx应用-Location路由反向代理及重写策略 请求转发-URL匹配规则 NGINX Reverse Proxy
    (转载)你好,C++(1)C++是什么?C++的“前世今生”
    (原创)cocos2d-x 3.0 示例代码分析5:testBasic
    (原创)cocos2d-x 3.0 示例代码分析4:VisibleRect
    (原创)cocos2d-x 3.0 示例代码分析3:BaseTest
    (摘要)100个伟大的商业理念:理念35:引爆流行
    (摘要)100个伟大的商业理念:理念34:企业社会责任
    (摘要)100个伟大的商业理念:理念32:重新改造
  • 原文地址:https://www.cnblogs.com/chorrysky/p/1237693.html
Copyright © 2011-2022 走看看