SqlCacheDependency не работает - PullRequest
       2

SqlCacheDependency не работает

3 голосов
/ 15 сентября 2011

Я хотел бы добавить SqlCacheDependency в мое приложение.Поэтому я решил создать небольшой проект tesp и столкнулся с трудностями.Я использую MSSQL 2008. Я создаю новую базу данных с таблицей строк и добавил несколько строк.Я выполнил:

ALTER DATABASE ForTest SET ENABLE_BROKER 

в студии managmeng.

Страница Aspx:

public partial class WebForm1 : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {
      if (!IsPostBack)
      {
       if (Cache["Lines"] == null)
       {
         string connectionString = 
           WebConfigurationManager.ConnectionStrings["ForTest"].ConnectionString;
         SqlConnection con = new SqlConnection(connectionString);
         string query = "SELECT dbo.Lines.Id, dbo.Lines.Value FROM dbo.Lines";
         SqlCommand cmd = new SqlCommand(query, con);
         SqlDataAdapter adapter = new SqlDataAdapter(cmd);

         DataSet ds = new DataSet();
         adapter.Fill(ds, "Lines"); 

         SqlCacheDependency empDependency = new SqlCacheDependency(cmd);
         Cache.Insert("Lines", ds, empDependency); 
       }
      }
    }

    protected void btnResult_OnClick(object sender, EventArgs e)
    {
      var result = Cache["Lines"];
    }
}

Я запускаю эту страницу и добавляю строки в Cache, затем добавляю строку в Managment Studio, и когда я нажимаю кнопку, я ожидаю, что кеш будет изменен, но кешостается старымЯ не могу найти то, что я делаю неправильно :( Не могли бы вы дать мне подсказку, как я могу решить эту проблему?

Спасибо

Обновление: я не могу сказать, что в global.aspx я запускаю:

SqlDependency.Start(
    WebConfigurationManager.ConnectionStrings["ForTest"].ConnectionString
);

Ответы [ 3 ]

7 голосов
/ 04 ноября 2011

У меня была похожая проблема.Эта статья: Устранение неполадок SqlCacheDependency в SQL Server 2008 и SQL Server 2005 мне тогда очень помогло.

В двух словах: база данных была восстановлена ​​из резервной копии, и исходный пользователь Windows, которыйСозданная база данных больше не была доступна.Поэтому я изменил владельца базы данных на действительный логин, похожий на:

ALTER AUTHORIZATION ON DATABASE::[my_perfect_database_name] TO [sa];

, и теперь он работает как чудо.

Как я нашел источник проблемы?Я запустил запрос SELECT * FROM sys.transmission_queue и нашел следующие данные в столбце transmission_status:

Исключительная ситуация при постановке сообщения в очередь назначения.Ошибка: 15517, состояние: 1. Невозможно выполнить роль участника базы данных, так как субъект "dbo" не существует, этот тип участника не может быть олицетворен или у вас нет разрешения.

Это сообщениедал мне ключ к решению проблемы.

0 голосов
/ 18 сентября 2015

Я также думал, что у меня проблема с тем, что SqlCacheDependency не очищается после изменения таблицы.

Оказывается, это из-за того, как я тестировал.Я просто редактировал строки в таблице SQL в студии управления и ожидал, что она уведомит и очистит кэш.Это не тот случай!Если вы редактируете таблицу, вы должны также повторно выполнить select sql, чтобы начать очистку кэша.

0 голосов
/ 30 апреля 2012

Ошибка в коде;

Определение sqldependency должно быть помещено перед выполнением команды, в противном случае он не будет подписываться на вашу sqlcommand, а затем не будет уведомлен, когда ваш набор результатов вашей команды изменится.

SqlCacheDependency empDependency = new SqlCacheDependency(cmd);

DataSet ds = new DataSet();
adapter.Fill(ds, "Lines"); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...