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