2011-12-16 15 views
1

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

「マスターキー」は、集約キャッシュの依存関係をテストするためにそこにあります - それは素晴らしい作品を変更するが、1(変数scd)にSQLの依存関係は単に動作していません。行を削除しても何も起こらない場合、キャッシュはクリアされません。

enter image description here

SQLの依存関係が/発火を登録していない理由として任意のアイデアをいただければ幸いです!

答えて

1

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

ALTER DATABASE [YourDB] SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE 

SqlDependency.Start(connectionString) 

そしてApplication_Endでストップを()(呼び出し)。

ストアドプロシージャのコードを投稿できますか?万が一あなたのSPの冒頭にSET NOCOUNT ONがありますか?もしそうなら、それはクエリ通知を防ぐでしょう。

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

+0

私はこれらのことを設定していませんでした。多分私は何かが分かりませんでしたが、私はクラスのドキュメントの読んで、私はそのデータベースの変更ステートメントを思い出しません。それを今試みている。 –

+0

Oh - WRT sproc - これは間違いだと私は思っています。最初はsprocsだと思っていましたが、直接SQL文で試してみましたが、まだ喜んでいませんでした。 –

+0

ありがとう、それは単純なことの組み合わせに加えて私は同じcmdに実行される私の依存関係が必要です。 –