SqlCacheDependency



web页面代码片段:

SqlCacheDependency_二级SqlCacheDependency_数据库_02web页面代码 String connectionString = "Data Source=localhost;Initial Catalog=BalloonShop;Integrated Security=True";

DataTable dt = (DataTable)HttpContext.Current.Cache["Customer_test"];

if (dt == null)

{

using (SqlConnection conn = new SqlConnection(connectionString))

{

String sqlStr = "SELECT dbo.Product.ProductID, Name, col_name FROM" +

" dbo.Product inner join dbo.ProductCategory on " +

" dbo.Product.ProductID = dbo.ProductCategory.ProductID inner join" +

" dbo.tb_category on dbo.ProductCategory.CategoryID = dbo.tb_category.col_id";

conn.Open();

SqlCommand command = new SqlCommand();

command.Connection = conn;

command.CommandText = sqlStr;

// DataTableCache.Dependency = new SqlCacheDependency(command);

SqlCacheDependency dependency = new SqlCacheDependency(command);

SqlDataAdapter adapter = new SqlDataAdapter(command);

DataSet ds = new DataSet();

adapter.Fill(ds, "Customers");

dt = ds.Tables[0];

// command.Connection.Close();

DataTableCache.AddCache("Customer_test", dt, command);//缓存通知失效 不起作用

DataTableCache.AddCache("Customer_test", dt, dependency );// 成功

// HttpContext.Current.Cache.Insert("Customer_test", dt, dependency);


}

}


gvwCustomers.DataSource = dt;

gvwCustomers.DataBind();

DataTableCahche的代码片段:

SqlCacheDependency_二级SqlCacheDependency_数据库_02DataTableCache代码 public class DataTableCache

{

private DataTableCache(){ }

private static SqlCacheDependency dependency = null;


public static SqlCacheDependency Dependency {

get { return dependency; }

set { dependency = value; }

}

public static void AddCache(String key, DataTable dt,SqlCommand command) {

dependency = new SqlCacheDependency(command);

HttpContext.Current.Cache.Insert(key, dt, dependency);

}

public static void AddCache(String key, DataTable dt, SqlCacheDependency dependency) {

HttpContext.Current.Cache.Insert(key, dt, dependency);

}

public static void AddCache(String key, DataTable dt) {

HttpRuntime.Cache.Insert(key,dt, dependency);

}

}

当我使用上面红色的部分插入cache的时候,我改变数据库中的数据时,界面上的数据却不会变化,通知失效机制不能成功运行,
当我使用蓝色的部分插入cache的时候,
我改变数据库中的数据时,界面上的数据能发生变化,通知失效机制能成功运行,我很困惑,这到底是什么原因?


​进入新版​


所有回答(2) 0 0

这个有问题


private static SqlCacheDependency dependency = null;

public static SqlCacheDependency Dependency {
get { return dependency; }
set { dependency = value; }
}
public static void AddCache(String key, DataTable dt,SqlCommand command) {
dependency = new SqlCacheDependency(command);
HttpContext.Current.Cache.Insert(key, dt, dependency);
}

应该是你这边全局static有点问题,更改成静态单件构造函

你更改成试试:

public static void AddCache(String key, DataTable dt,SqlCommand command) {
SqlCacheDependency _dependency = new SqlCacheDependency(command);
HttpContext.Current.Cache.Insert(key, dt, _dependency);
}

SqlCacheDependency_数据库_05这个我试过,好像也不行,

还有就是问题出在command上,在command执行以后,比如执行以下语句之后:

command.ExecuteReader();

SqlDataAdapter adapter = new SqlDataAdapter(command);

在把command赋给SqlCacheDependency时就会不起作用,

而在command执行之前赋给SqlCacheDependency就可以,

但我不太清楚这里边的运行机制

看看这里
http://www.dotnetcurry.com/ShowArticle.aspx?ID=263&AspxAutoDetectCookieSupport=1

的确需要在 cmd.ExecuteNonQuery();之前执行

  SqlCacheDependency dependency = new SqlCacheDependency(cmd);