Невозможно сделать кеш недействительным в зависимости от SQL-запроса - PullRequest
0 голосов
/ 02 декабря 2010

Я пытаюсь сделать кеш недействительным на основании изменения в строках базы данных. Я добился успеха, выполнив то же самое с linq с той же базой данных и таблицей, но я не смог сделать это в основном:

Вот код, который я написал, пожалуйста, помогите:

public DataSet GetData(string sqlCmd)
    {
        string connectionStr = System.Configuration.ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString;
        string cacheKey = "test123";
        DataSet ds = (DataSet)HttpRuntime.Cache.Get(cacheKey);
        if (ds != null)
        {
            return ds;
        }
        SqlCacheDependency sqldep = null;
        SqlConnection conn = new SqlConnection(connectionStr);
        SqlCommand cmd = new SqlCommand(sqlCmd, conn);
        cmd.Notification = null;
        cmd.NotificationAutoEnlist = true;
        SqlDataAdapter sqlAd = new SqlDataAdapter(cmd);
        ds = new DataSet();
        sqlAd.Fill(ds);

        System.Web.Caching.SqlCacheDependencyAdmin.EnableNotifications(connectionStr);
        string NotificationTable = "TblMetaData";
        if (!System.Web.Caching.SqlCacheDependencyAdmin.GetTablesEnabledForNotifications(connectionStr).Contains(NotificationTable))
            System.Web.Caching.SqlCacheDependencyAdmin.EnableTableForNotifications(connectionStr, NotificationTable);
        sqldep = new SqlCacheDependency(cmd);

        HttpRuntime.Cache.Insert(cacheKey, ds, sqldep);
        return ds;

    }

Я использую Sql Server 2005 и использую полные запросы, которые могут работать с командными уведомлениями.

Мой другой код в Linq отлично работает с той же базой данных и таблицей, поэтому нет никакого смысла в том, что компонент Service Broker или другие права доступа не установлены. Пожалуйста, помогите мне избавиться от этой проблемы.

Ответы [ 2 ]

1 голос
/ 02 декабря 2010

Эта статья содержит несколько шагов по устранению неполадок Таинственное уведомление , а также объяснение того, как все работает, когда помогает понять, почему что-то сломалось. Вы должны подтвердить, что каждая часть машины работает:

  • проверьте, что уведомление о подписке создается в sys.dm_qn_subscriptions
  • проверить, что уведомление получено запущено
  • проверьте, что уведомление получает доставлено (вы можете спокойно игнорировать все, что касается маршрутизации и удаленной доставки в этой ссылке, так как SqlDependency всегда локальный)

В несвязанной заметке вы можете напрямую использовать LINQ-to-SQL и уведомления о запросах: LinqToCache .

0 голосов
/ 07 июля 2011

Лучшее, что можно сделать: посмотрите на журнал sql, если возникнут какие-либо проблемы с уведомлениями, журнал покажет!

журнал ошибок находится в папке Program Files \ Microsoft SQL Server \ MSSQL.n \ MSSQL \ LOG \ ERRORLOG и ERRORLOG.n

В моем случае проблема возникла из-за восстановления базы данных,чтобы решить, журнал показал мне проблему, затем я выполняю

use DatabaseName EXEC sp_changedbowner 'sa'
...