以下代码不知道什么原因。。删除DataTable里面的一条数据,每次页面刷新一下就会少一条数据。。不明白什么原因。。
我对DataTable操作后并没有保存到缓存当中呀。。为什么每次刷新缓存当中的数据就会少一条数据....        DataTable dt;
        //头6条新闻
        if (WebClass.IsExistCache("YJPF_NEWS_TOP_6"))//检测缓存
        {
            dt = (DataTable)WebClass.GetCache("YJPF_NEWS_TOP_6");//自定义类获取缓存
        }
        else
        {
            sql = "select top 6 [ID],[Title] from [tb_news] order by [ID] desc";
            dt = au.GetDtList(sql);
            WebClass.SetCache("YJPF_NEWS_TOP_6", dt);
        }
        if (dt.Rows.Count != 0)
        {
            dt.Rows[0].Delete();
            if (dt.Rows.Count != 0)
            {
                rep_list_news.DataSource = dt;
                rep_list_news.DataBind();
            }
        }修改成这样就能解决。。        DataTable dt;
        //头6条新闻
        if (WebClass.IsExistCache("YJPF_NEWS_TOP_6"))//检测缓存
        {
            dt = (DataTable)WebClass.GetCache("YJPF_NEWS_TOP_6");//自定义类获取缓存
        }
        else
        {
            sql = "select top 6 [ID],[Title] from [tb_news] order by [IsTop] desc,[ID] desc";
            dt = au.GetDtList(sql);
            WebClass.SetCache("YJPF_NEWS_TOP_6", dt);
        }
        if (dt.Rows.Count != 0)
        {
            dt.Rows[0].Delete();
            if (dt.Rows.Count != 0)
            {
                rep_list_news.DataSource = dt;
                rep_list_news.DataBind();
            }
            dt.RejectChanges();
        }

解决方案 »

  1.   

    DataTable.RejectChanges方法
    回滚自该表 加载以来或上次调用 AcceptChanges 以来对该表进行的所有更改。
    调用 RejectChanges 时,任何仍处于编辑模式的 DataRow 对象将取消其编辑。新行被移除。DataRowState 设置为 Modified 或 Deleted 的行返回到其初始状态。
      

  2.   

    删除datatable的行 
    采用datatable.Rows[i].Delete()删除行后再访问该表时出现出现“不能通过已删除的行访问该行的信息”的错误。原因如下:Delete()之后需要datatable.AccepteChanges()方法确认完全删除,因为Delete()只是将相应列的状态标志为删除,还可以通过datatable.RejectChanges()回滚,使该行取消删除。所以如果要彻底删除datarow,需要Delete()和AccepteChanges()方法同时使用,或者采用 datatable.Rows.RemoveAt(i)方法直接删除,其中i表示行索引,还有一个就是 datatable.Rows.Remove(DataRow dr)删除指定行。不过使用datatable.Rows.RemoveAt(i)要注意,如果连续使用 datatable.Rows.RemoveAt(0);datatable.Rows.RemoveAt(1);这时并不是删除了原表中的0,1行,而 是删除0行后,原来的1行就变成了0行,所以datatable.Rows.RemoveAt(1)实际删除的是原表的2行。所以还是要慎用datatable.Rows.RemoveAt(i),若要删除多行,可以连续用Delete(),然后采用AccepteChanges()方法确认删除。
      

  3.   

    这个我从网上也找了点资料。。使用RemoveAt()方法删除数据。。我采用循环倒着删除可是刷新缓存中的数据还是照样的少一条数据。。后来我改成用DataSet来操作。。可是得到的结果还是一样。。刷新少一条数据原因还是不明白因为我操作了DataTable或者DataSet后并没有在把这个操作后的数据表保存到缓存当中。。当页面加载的时候先判断缓存是否存在。。如果不存在在去查数据库。。在保存
      

  4.   

    sp1234我明白你的意思。。非常感谢您的回复...根据代码我的理解是:1.页面加载第一次加载,缓存肯定是不存在了,从数据库查询到6条记录,分别保存在DataTable和cache中,  在删除DataTable中的第一条记录(cache里面应该保存的还是6条数据(问题在这,我并没有对cache进行里面的数据操作吧))。。第一次结束2.页面刷新在执行页面的时候,cache是存在的(我认为数据应该还是6条。。因为我都没有对cache操作过),接着把cache在重新赋给DataTable,那么这个时候DataTabel是不是应该又变成6条数据了...可是却是少了一条数据..我都没有对cache进行过操作。。不知道我这样说大家能不能明白我不明白的地方,表达不清楚敬请谅解~
      

  5.   

    if (dt.Rows.Count != 0)
    {
        dt.Rows[0].Delete();
        if (dt.Rows.Count != 0)
        {你这里不是有个删除操作么?你这个删除操作是根据条件dt.rows.count来执行的,条件满足的话刷新一次当然执行一次。当然,确实dt是来自cache,但你先执行了删除才执行rep_list_news.DataSource = dt;
    当然数据是刷一次少一次咯
      

  6.   

    对dt的操作就是对缓存的操作,要想不影响缓存中的数据,要复制dt
    dt = ((DataTable)WebClass.GetCache("YJPF_NEWS_TOP_6")).Copy(); //自定义类获取缓存