在实现非常基本的SqlCacheDependency原型时遇到问题。
我已经尝试过使用存储过程来实现这一点,但现在我将直接执行命令。
public SqlCommand GetReadCommand(int ID)
{
SqlCommand cmd = new SqlCommand("SELECT dbo.Entity.Entity_ID, dbo.Entity.Name FROM dbo.Entity WHERE Entity_ID = @ID", _conn);
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add(new SqlParameter("ID", ID));
return cmd;
}
public SqlCacheDependency GetSqlDependency(int ID)
{
SqlCommand cmd = GetReadCommand(ID);
SqlCacheDependency dep = new SqlCacheDependency(cmd);
return dep;
}我正在读取所有对象的数据集,并在手动插入的一些数据上创建一个非常简单的依赖性测试:
public DataSet SelectAll()
{
DataSet result;
if (_cache["Entity_FullSet"] == null)
{
SqlCommand cmd = new SqlCommand("dbo.GetAllEntities", _conn);
cmd.CommandType = CommandType.StoredProcedure;
_conn.Open();
SqlDataAdapter da = new SqlDataAdapter(cmd);
result = new DataSet();
da.Fill(result);
_cache[MasterCacheKey()] = DateTime.Now;
string[] mk = new[] { MasterCacheKey() };
CacheDependency cd = new CacheDependency(null, mk);
SqlCacheDependency scd = new SqlCacheDependency(GetReadCommand(1));
CacheDependency[] cds = new[] { cd, scd };
AggregateCacheDependency acd = new AggregateCacheDependency();
acd.Add(acd);
_cache.Insert("Entity_FullSet", result, scd);
_conn.Close();
}
else
{
result = (DataSet)_cache["Entity_FullSet"];
}
return result;
}“主键”是用来测试聚合缓存依赖关系的--更改它的效果很好,但1(变量scd)上的sql依赖关系根本就不起作用。如果我去更新表--甚至删除行--什么都不会发生,缓存也不会被清除。

任何关于为什么sql依赖没有注册/触发的想法都将不胜感激!
发布于 2011-12-17 16:16:54
您是否在数据库中启用了service broker,并打开了查询通知?
ALTER DATABASE [YourDB] SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE在Application_Start()中:
SqlDependency.Start(connectionString)并在Application_End()中调用Stop()。
你能发布你的存储过程的代码吗?您是否碰巧在SP开头使用了SET NOCOUNT ON?如果是这样的话,这将阻止查询通知。
对于上面发布的代码,请尝试用由一个或两个部分组成的名称替换由3部分组成的列名。例如,将"dbo.Entity.Entity_ID“替换为"Entity_ID”或(更好) "e.Entity_ID“(在将别名"e”分配给dbo.Entity之后)。
https://stackoverflow.com/questions/8539776
复制相似问题