【问题标题】:SqlCacheDependency not working when using SqlCommand for cache-key将 SqlCommand 用于缓存键时,SqlCacheDependency 不起作用
【发布时间】:2012-01-09 15:02:13
【问题描述】:

这段代码运行良好,只要在数据库中更改数据,它就会使数据失效:

    AggregateCacheDependency aggDep = new AggregateCacheDependency();

                System.Data.SqlClient.SqlCommand ocom = new System.Data.SqlClient.SqlCommand();
                SqlCacheDependency SqlDep = new SqlCacheDependency("DBNAMEINCONFIG", "Products");    
                aggDep.Add(SqlDep);

虽然我不能在整个“产品”表上直接无效,但我需要能够使表上的选择无效。我遇到的问题是以下代码在数据更改时不会使缓存失效:

AggregateCacheDependency aggDep = new AggregateCacheDependency();

            System.Data.SqlClient.SqlCommand ocom = new System.Data.SqlClient.SqlCommand();
            ocom.CommandText = "SELECT ID,ClinicID,Price,Enabled FROM dbo.Products WHERE ClinicID = 1";
            ocom.Connection = new System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings["DBSTRING"].ToString());
            SqlCacheDependency SqlDep = new SqlCacheDependency(ocom);

            aggDep.Add(SqlDep);

我试图包含分析此问题所需的所有信息,但如果我应该包含更多信息,请告诉我!

【问题讨论】:

    标签: c# .net caching sqlcommand sqlcachedependency


    【解决方案1】:

    问题是,根据here 概述的规则,您不能使用SELECT * 进行查询。

    以下更改应该可以解决您的问题:

    ocom.CommandText = "SELECT ClinicID FROM Products WHERE ClinicID = 1";
    

    【讨论】:

    • 感谢您的提示。我更新了 SELECT 语句,但问题仍然存在,即使表(和 SELECT 语句)中的某些内容发生更改,缓存也不会失效。
    • 啊,也许可以尝试添加特定的列来改变 select 语句。我有点不清楚底层机制到底是如何工作的,但它可能正在查看 select 语句本身的列。
    • 我用当前代码更新了开头的帖子。更改了这一行:ocom.CommandText = "SELECT ID,ClinicID,Price,Enabled FROM dbo.Products WHERE ClinicID = 1";
    • 即使 SELECT 语句看起来符合要求,它仍然不会使缓存失效。
    【解决方案2】:

    正如 competent_tech 所指出的,用于构建 SqlCacheDependency 的查询有很多规则。 根据这篇MSDN 的文章,最重要的是:

    1. 不要在查询中使用 SELECT * 或 table_name.*。
    2. 您必须使用完全限定的表名(例如 dbo.Products)。

    除了这些规则之外,执行用于构建SqlCacheDependencySqlCommand 以启用查询通知也很重要:

    using (SqlDataReader reader = ocom.ExecuteReader())
    {
      while (reader.Read())
      {           
      }
    } 
    
    SqlCacheDependency SqlDep = new SqlCacheDependency(ocom);
    
    aggDep.Add(SqlDep);
    

    希望,这会有所帮助。

    【讨论】:

    • 汉斯,我尝试在创建 SqlCacheDependency 对象之前执行该命令,但它仍然无法使缓存对象无效。
    • @GregSnider:能否请您发送更完整的代码示例(如何初始化 SqlCacheDependency 基础架构)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多