想实现2.0中的缓存和sql依赖,数据库是sqlserver2005企业版,ASP.NET2.01、首先使用SqlCacheDependencyAdmin.EnableNotifications 
和SqlCacheDependencyAdmin.EnableTableForNotifications 方法启用依赖
看资料上写的sqlserver2005可以不执行这两个方法,一开始就没执行,但是执行与不执行目前都不行
2、声明SqlCacheDependency时是使用填充table是使用的command对象
3、使用Cache.Add(),方法将SqlCacheDependency和table都加到缓存中但是当我修改了相关记录后,在执行数据仍然从缓存中可以提取到请教是什么原因?为什么依赖没起作用呢?谢谢

解决方案 »

  1.   

    查看你的数据库中
    是否存在asp_netXXXX
    这张表,没有的话就是数据库的问题了查看你是否开启了缓存
    比如你有没有设置什么EnableCache变量来提示是否开启缓存查看业务逻辑层层是否调用了缓存,
      

  2.   

    谢谢楼上的,
    数据库中有AspNet_SqlCacheTablesForChangeNotification这张表另外开启缓存是什么意思?我是先判断缓存中有否有该内容,例如
    if(Cache[CacheName] == null)
    {
    }
    else
    {
    }如果是空就直接连接数据库提取数据
    创建SqlCacheDependency对象
    用Cache.add()添加如果不是null,则从缓存中提取,而不访问数据库但是经过测试,即使我更改了数据库相关记录,仍然可以从缓存中提取数据!
      

  3.   

    SqlCacheDependency我记得没错的话,应该是在第三个参数位置
    Programming IN ASP.NET 有详细的Cache用法介绍
      

  4.   

    我是做了一个试验的页面,页面上一个按钮,一个DataGrid按钮click事件处理程序如下:
    ---------------------------------------------------------------------
    String CacheName = "Cache:Name";
    String strconnection = @"Server=localhost\SqlServer;Database=db1;User 
    ID=a1;Password=a1;";DataTable table = new DataTable();if (Cache[CacheName] == null)

         SqlConnection conn = new SqlConnection(strconnection);
         SqlCommand cmd = new SqlCommand("select * from tt1 where t1 = @t11", 
    conn);
         SqlParameter para = new SqlParameter("@t11", DbType.String);
         para.Value = "1";
         cmd.Parameters.Add(para);     SqlDependency.Start(strconnection);
         SqlCacheDependency dep = new SqlCacheDependency(cmd);     SqlDataAdapter adp = new SqlDataAdapter(cmd);     conn.Open();
         adp.Fill(table);
         conn.Close();     //DateTime dt = DateTime.Now.AddMinutes(30);
         TimeSpan ts = new TimeSpan(1, 0, 0);
         Cache.Add(CacheName, table, dep, Cache.NoAbsoluteExpiration, ts, 
    CacheItemPriority.High, null);     g1.DataSource = table;
         g1.DataBind();           
    }
    else
    {
         table = (DataTable)Cache[CacheName];     g1.DataSource = table;
         g1.DataBind();
    }
    ---------------------------------------------------------------------
    然后通过断点查看程序执行的是哪个分支,并且观察在表中数据发生改变时,会不会移除缓存项
    但是始终程序走的都是Cache[CacheName] == null这个分支,也就是每次都是从数据库中提取数据觉得可能是我某些方面理解理解错误望指点,谢谢!
      

  5.   

    select   *   from   tt1   where   t1   =   @t11 
    语名有问题,不能用*号,表名要用dbo.tt1
      

  6.   

    呵呵,是使用SqlDataAdapter   的原因啊!