SqlCacheDependency с SqlCommand не работает
Возникли проблемы с реализацией очень простого прототипа 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;
}
"Главный ключ" предназначен для тестирования агрегатных зависимостей кэша - его изменение прекрасно работает, но зависимость sql от 1 (переменная scd) просто не работает. Если я иду и обновляю таблицу - даже удаляю строку - ничего не происходит, кэш не очищается.
Будем весьма благодарны за любые идеи относительно того, почему sql-зависимость не регистрируется / запускается!
1 ответ
Вы включили сервисный брокер в БД и включили уведомления о запросах?
ALTER DATABASE [YourDB] SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE
В Application_Start():
SqlDependency.Start(connectionString)
И вызовите Stop() в Application_End().
Можете ли вы опубликовать код для вашей хранимой процедуры? Есть ли у вас случайно SET NOCOUNT ON
в начале вашего SP? Если это так, это предотвратит уведомления о запросах.
Для кода, опубликованного выше, попробуйте заменить имена этих столбцов из трех частей именами из одной или двух частей. Например, замените "dbo.Entity.Entity_ID" на "Entity_ID" или (лучше) "e.Entity_ID" (после назначения псевдонима "e" для dbo.Entity).