2017-11-10 5 views
-1
SqlConnection cn; 
SqlCommand cmd; 
SqlDependency dependency; 
DataTable dt; 
static string obj= string.Empty; 
public Form1() 
    { 
     InitializeComponent(); 
     CheckForIllegalCrossThreadCalls = false; 
     try 
     { 
      SqlClientPermission perm = new SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted); 
      perm.Demand(); 
     } 
     catch 
     { 
      throw new ApplicationException("No permission"); 
     } 
    } 

private void Form1_Load(object sender, EventArgs e) 
    { 
     MyMethod(); 
    } 
void Dependency() 
    { 
     dependency = new SqlDependency(cmd); 
     SqlDependency.Start(cn.ConnectionString); 

     dependency.OnChange += Dependency_OnChange; 
    } 
void MyMethod() 
    { 
     try 
     { 
      cn= new SqlConnection("My Connection String"); 
      cmd = new SqlCommand("Select Column1,Column2,Column3,Column4,Column5 from [dbo].TableName where Column1=value", cn); 
      if (cn.State == ConnectionState.Closed) 
       cn.Open(); 
      Dependency(); 
      SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); 
      while (dr.Read()) 
      { 
       obj=dr["Column2"].ToString(); 
      } 
      MessageBox.Show(obj); 
      baglanti.Close(); 
      cmd.Dispose(); 
      dr.Close(); 
    } 
     catch(Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
private void Dependency_OnChange(object sender, SqlNotificationEventArgs e) 
    { 
     MessageBox.Show("Data Change. " + e.Info.ToString()); 
     dependency.OnChange -= Dependency_OnChange; 
     MyMethod(); 
    } 

このコードはローカルデータベースで動作しています。私の質問は、なぜデータベースがサーバー上にあるときには機能していないということです。このコードは、サーバーで実行されると、私は(作業中にログインが失敗しましたsqldependency

「ユーザーのログインに失敗しました」)は、このエラーメッセージが表示されます。しかし、依存コードブロックを削除すると、これは動作しています。したがって、ConnectionStringとSQLクエリは問題ではありません。私は "MessageBox.Show(" データ変更。 "+ e.Info.ToString())"

作業とe.Info値が無効である

のConnectionStringノンストップに'persist security info=True'を追加しました。お願い助けて。

+0

以前はSqlDependencyを使用したことがありませんでしたが、https://stackoverflow.com/questions/2730798/sqldependency-threadからのリンクによれば、別のスレッドでChangeイベントが発生しています窓のGUIアプリケーションので、非常に奇妙なことが起こるだろう非UIスレッドは、メッセージボックスを作成します。これは良くない。データベースの変更にただちに反応しようとしていますか?これはキャッシュや何かをリフレッシュするのですか?あなたが望むものを達成するためのもっと簡単な方法があるかもしれません – GPW

答えて

0

これは、SqlDependencyとは関係ありません。無効な接続文字列を使用しています。他の開いている接続からプロパティとして読み取られた接続文字列を決して通過しないでください。接続を開くために使用された元の接続文字列を渡します。ユーザー設定として保存し、SqlConnectionStringBuilderにロードし、他の必要なプロパティを明示的に設定してから、ビルダーを読み取ることをお勧めします。フォームデザイナーで接続文字列を設計しないでください。

e.Infoの値が無効です。

また、e.Sourceおよびe.Typeも調べてください。

関連する問題