【问题标题】:SqlCacheDependency with SqlCommand not workingSqlCommand 的 SqlCacheDependency 不起作用
【发布时间】:2011-12-16 20:32:44
【问题描述】:

在实现非常基本的 SqlCacheDependency 原型时遇到问题。

已经用 sproc 尝试过这个,但现在我要直接执行命令了。

    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 依赖项没有注册/触发的想法将不胜感激!

【问题讨论】:

    标签: asp.net sqlcachedependency


    【解决方案1】:

    您是否在数据库中启用了服务代理,并打开了查询通知?

    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 之后)。

    【讨论】:

    • 我没有设置这些东西——也许我错过了一些明显的东西,但在阅读类文档时,我不记得遇到过那个 alter database 语句。现在就试试吧。
    • 哦 - WRT sproc - 我认为这个标题很糟糕 - 一开始我以为是 sprocs,但后来我用直接的 sql 语句尝试了它,但仍然没有乐趣。
    • 谢谢,这是一个简单的组合加上我需要我的依赖是在同一个 cmd 执行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多