SqlCacheDependency с SqlCommand не работает - PullRequest
1 голос
/ 17 декабря 2011

Возникли проблемы с реализацией очень простого прототипа 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) просто не работает. Если я иду и обновляю таблицу - даже удаляю строку - ничего не происходит, кэш не очищается.

enter image description here

Будем весьма благодарны за любые идеи относительно того, почему SQL-зависимость не регистрируется / запускается!

1 Ответ

1 голос
/ 17 декабря 2011

Включили ли вы компонент Service Broker в БД и включили уведомления о запросах?

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).

...