1

非常に基本的な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;
    }

「マスターキー」は、集約キャッシュの依存関係をテストするためにあります。これを変更するとうまくいきますが、1(変数scd)へのSQLの依存関係は単に機能しません。テーブルを更新して(行を削除しても)何も起こらず、キャッシュはクリアされません。

ここに画像の説明を入力してください

SQL依存関係が登録/起動されない理由に関するアイデアは大歓迎です!

4

1 に答える 1

1

DBでサービスブローカーを有効にし、クエリ通知をオンにしましたか?

ALTER DATABASE [YourDB] SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE

Application_Start()の場合:

SqlDependency.Start(connectionString)

そして、Application_End()でStop()を呼び出します。

ストアドプロシージャのコードを投稿できますか?あなたはたまたまSET NOCOUNT ONあなたのSPの始めに持っていますか?もしそうなら、それはクエリ通知を防ぎます。

上記のコードの場合、これらの3つの部分からなる列名を1つまたは2つの部分からなる名前に置き換えてみてください。たとえば、「dbo.Entity.Entity_ID」を「Entity_ID」または(より適切な)「e.Entity_ID」に置き換えます(エイリアス「e」をdbo.Entityに割り当てた後)。

于 2011-12-17T08:16:54.160 に答える