none
从cache中取出的dataview无法应用rowfilter和sort操作么?vs2003 RRS feed

  • 问题

  • Global.asax文件中
    protected void Application_Start(Object sender, EventArgs e)
    
    <br/>{	
    
      if(ConfigurationSettings.AppSettings["enablecache"].ToString()=="true")
    
        {
    
    	RefreshCache();
    
        }
    
    			
    
    }
    
    
    
    public static void RefreshCache()
    
    
    
    		{
    
    			string sql="select id,caid,filetitle,filetype,filename,pubdate from web_repository where subsiteid='root' and state='4'";
    
    			OracleDataAdapter adapter=new OracleDataAdapter(sql,ConfigurationSettings.AppSettings["ERP"]);
    
    
    
    			DataSet ds=new DataSet();
    
    
    
    			adapter.Fill(ds,"web_repository");
    
    
    
    			CacheItemRemovedCallback onRemove=new CacheItemRemovedCallback(cRemovedCallback);
    
    
    
    			string depFile=ConfigurationSettings.AppSettings["dependencyFile"].ToString();
    
    
    
    			HttpContext.Current.Cache.Insert("web_repository",ds,new CacheDependency(depFile),
    
    
    
    				Cache.NoAbsoluteExpiration,Cache.NoSlidingExpiration,
    
    
    
    				CacheItemPriority.High,onRemove);
    
    
    
    			blnReflash=true;
    
    
    
    		}
    
    		public static void cRemovedCallback(String key, object value, 
    
    			CacheItemRemovedReason removedReason)
    
    		{
    
    			blnReflash = true;
    
    			RefreshCache();
    
    		}
    
    
    在我的类中
    private  DataView getcache(int count,string filter,string orderby,string order)//从cache中读取数据
    
    		{
    
    			if (HttpContext.Current.Cache["web_repository"] != null)
    
    			{
    
    				
    
    				DataSet ds = (DataSet)HttpContext.Current.Cache.Get("web_repository");
    
    				DataView dv = new DataView();
    
    				dv.Table = ds.Tables["web_repository"];
    
    				dv.RowFilter = "id='1034'";
    
    				dv.Sort = orderby + " " + order;
    
    				
    
    				return dv;
    
    			}
    
    			else
    
    			{
    
    				Global.RefreshCache();
    
    				return (DataView)HttpRuntime.Cache["web_repository"];
    
    			}
    
    
    
    		}
    
    
    我把所有文章从数据库中取出来,然后缓存到cache里面,各个栏目都从cache中过滤自己栏目的数据,可是我发现,无论rowfilter条件是什么,过滤出来的数据都驴头不对马嘴,比如上面我要取id=1034的记录,可是取出来的却是cache中,没有经过排序的第一条记录。而且当过滤结果为多条的时候,比如我取栏目caid=002-001的数据,过滤后的数据可能各个栏目的都有,但是肯定是从cache中的第一条记录开始的,很怪异的问题,直接从数据库取数据就不存在这种问题,困扰了很久了,身心憔悴,请大哥们一定帮我解决啊
    2009年7月10日 8:52

答案

  • // 尝试改为下面的方式试试
    private DataTable GetCacheDataTable(string filter, string order)
    {
        if (HttpContext.Current.Cache["web_repository"] == null)
            Global.RefreshCache();
        DataSet fCacheDS = (DataSet)HttpContext.Current.Cache.Get("web_repository");
        DataSet fReturnDS = cacheDS.Clone();
        fReturnDS.Merge(fCacheDS.Tables["web_repository"].Select(filter, order));
        return fReturnDS.Tables["web_repository"];
    }

    知识改变命运,奋斗成就人生!
    2009年7月10日 9:26
    版主

全部回复

  • Global.asax文件中
    protected void Application_Start(Object sender, EventArgs e)
    
    { if(ConfigurationSettings.AppSettings["enablecache"].ToString()=="true") { RefreshCache(); } } public static void RefreshCache() { string sql="select id,caid,filetitle,filetype,filename,pubdate from web_repository where subsiteid='root' and state='4'"; OracleDataAdapter adapter=new OracleDataAdapter(sql,ConfigurationSettings.AppSettings["ERP"]); DataSet ds=new DataSet(); adapter.Fill(ds,"web_repository"); CacheItemRemovedCallback onRemove=new CacheItemRemovedCallback(cRemovedCallback); string depFile=ConfigurationSettings.AppSettings["dependencyFile"].ToString(); HttpContext.Current.Cache.Insert("web_repository",ds,new CacheDependency(depFile), Cache.NoAbsoluteExpiration,Cache.NoSlidingExpiration, CacheItemPriority.High,onRemove); blnReflash=true; } public static void cRemovedCallback(String key, object value, CacheItemRemovedReason removedReason) { blnReflash = true; RefreshCache(); }
    在我的类中
    private  DataView getcache(int count,string filter,string orderby,string order)//从cache中读取数据
    		{
    			if (HttpContext.Current.Cache["web_repository"] != null)
    			{
    				
    				DataSet ds = (DataSet)HttpContext.Current.Cache.Get("web_repository");
    				DataView dv = new DataView();
    				dv.Table = ds.Tables["web_repository"];
    				dv.RowFilter = "id='1034'";
    				dv.Sort = orderby + " " + order;
    				
    				return dv;
    			}
    			else
    			{
    				Global.RefreshCache();
    				return (DataView)HttpRuntime.Cache["web_repository"];
    			}
    
    		}
    我把所有文章从数据库中取出来,然后缓存到cache里面,各个栏目都从cache中过滤自己栏目的数据,可是我发现,无论rowfilter条件是什么,过滤出来的数据都驴头不对马嘴,比如上面我要取id=1034的记录,可是取出来的却是cache中,没有经过排序的第一条记录。而且当过滤结果为多条的时候,比如我取栏目caid=002-001的数据,过滤后的数据可能各个栏目的都有,但是肯定是从cache中的第一条记录开始的,很怪异的问题,直接从数据库取数据就不存在这种问题,困扰了很久了,身心憔悴,请大哥们一定帮我解决啊
    2009年7月10日 8:21
  • // 尝试改为下面的方式试试
    private DataTable GetCacheDataTable(string filter, string order)
    {
        if (HttpContext.Current.Cache["web_repository"] == null)
            Global.RefreshCache();
        DataSet fCacheDS = (DataSet)HttpContext.Current.Cache.Get("web_repository");
        DataSet fReturnDS = cacheDS.Clone();
        fReturnDS.Merge(fCacheDS.Tables["web_repository"].Select(filter, order));
        return fReturnDS.Tables["web_repository"];
    }

    知识改变命运,奋斗成就人生!
    2009年7月10日 9:26
    版主
  • 还是不行,结果是一样的,取出来还是cache中dataset的第一条数据,真搞不懂这是为什么,哪里有例子啊,能够正常运行的例子
    2009年7月10日 13:02
  • 如果 DataTable 中只有一个记录的 Id 为 1034 那么你传 filter = "id = 1034" 只出一条记录是正确的
    知识改变命运,奋斗成就人生!
    2009年7月10日 13:07
    版主
  • 找到原因了,不知道为什么,从cache中直接取出来的DataSet,DataTable,DataView可以进行filter或者sort,而且记录条数也是对的,但是记录的内容就不对了,规律是取出来的记录总是cache中缓存的Data从第一条到第N条,所以感觉取出来的东西驴头不对马嘴,重新建一个DataTable,把从cache取出来的datatable复制一次就好了。谢谢二位的回复,真的很感谢二楼的兄弟。

    2009年7月10日 14:59