2011-09-15 68 views
3

私のアプリケーションにSqlCacheDependencyを追加したいと思います。 私はlittel tespプロジェクトを作成し、困難に直面することを望んでいました。 私はMSSQL 2008を使用しています。テーブルの行で新しいdbを作成し、いくつかの行を追加しました。 私が実行:SqlCacheDependencyが機能しない

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"]; 
    } 
} 

私はこのページを実行し、キャッシュに行を追加し、私は経営管理論のスタジオ内の行を追加し、ボタンの上に私をクリックしたときに、私はキャッシュが変更されますが、キャッシュが古いままであること を期待しています。 私は私が間違って何をすべきかを見つけることができません:(あなたは私、私はこの問題を解決することができますどのようにいくつかのヒントを与えることができる

おかげ

を更新:? 私はglobal.aspxで、私は実行することを言うために捏造:

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

答えて

7

私は同様の問題を持っていたこの記事:。Troubleshooting SqlCacheDependency in SQL Server 2008 and SQL Server 2005を、次に私をたくさん助けたいくつかの単語で

:databseをバックアップから復元し、データベースを作成し、元のWindowsユーザーはありませんでした。 l利用可能なワンガー。そこで、データベースの所有権を有効なログインに変更しました。

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

これは今のところ魅力的です。

問題の原因はどのようにして知りましたか?私は、クエリSELECT * FROM sys.transmission_queueを実行し、transmission_status列に次のデータが見つかりました:

An exception occurred while enqueueing a message in the target queue. Error: 15517, State: 1. Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission.

このメッセージは、問題の解決に私にキーを与えました。

0

コードに間違いがあります。

コマンドを実行する前にsqldependencyの定義を行う必要があります。それ以外の場合は、sqlコマンドをサブスクライブしません。コマンドの結果セットが変更されたときに通知されません。

SqlCacheDependency empDependency = new SqlCacheDependency(cmd); 

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

また、私は、テーブルへの変更後にクリアされていないSqlCacheDependencyで問題があったと思いました。

私がテストしていたからです。私は管理スタジオを介してSQLテーブルの行を編集し、キャッシュに通知してそれをクリアすることを期待していました。そうではありません!表を編集する場合は、select sqlを再実行してキャッシュのクリアを開始する必要があります。