データベースに変更があった場合は、SQLDependencyを使用して通知します。 プログラムの起動後、正常に動作します。最初の変更を行うと、イベントが発生します。 Wohoo ...それは素晴らしいです。 しかし、私が2回目の変更を行った場合、イベントは再開しません。私は思ったすべてのウェブを検索しましたが、この問題については何も見つかりませんでした。 OnChangeイベントがループ内で発生する問題のみが見つかりました。 誰でも助けてくれますか?ここでSQLDependency_OnChange - イベントは1つだけ発生します。時刻
少しコードピース:
private void GetStates()
{
if (!DoesUserHavePermission())
return;
SqlDependency.Stop(con);
SqlDependency.Start(con);
using (SqlConnection cn = new SqlConnection(con))
{
using (SqlCommand cmd = cn.CreateCommand())
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT Bla, Bla2, ..FROM dbo.[BLA3]"
cmd.Notification = null;
cmd.Dispose();
SqlDependency dep = new SqlDependency(cmd);
dep.OnChange += new OnChangeEventHandler(dep_OnChange);
cn.Open();
using (SqlDataReader dr = cmd.ExecuteReader())
{
state.Clear(); //In this Case "state" is a List<string>
while (dr.Read())
{
state.Add(dr.GetString(0) + "|" + dr.GetInt32(3));
}
dr.Dispose();
dr.Close();
}
}
}
}
私のOnChangeイベントは次のようになります。
private void dep_OnChange(object sender, SqlNotificationEventArgs e)
{
SqlDependency dep = sender as SqlDependency;
dep.OnChange -= this.dep_OnChange;
using (SqlConnection cn = new SqlConnection(con))
{
using (SqlCommand cmd = cn.CreateCommand())
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT Bla, Bla2, ..FROM dbo.[BLA3]";
cmd.Notification = null;
if (e.Type == SqlNotificationType.Change)
{
if (cn.State != ConnectionState.Open)
{
cn.Open();
}
using (SqlDataReader dr = cmd.ExecuteReader())
{
state.Clear(); // Clear and Refill the stringlist "state"
while (dr.Read())
{
state.Add(dr.GetString(0) + "|" + dr.GetInt32(3));
}
}
}
cn.Close();
}
}
this.GetStates(); //to go ahead and wait for a new change
}
どこに問題がありますか?
using (SqlCommand cmd = cn.CreateCommand())
{
...
cmd.Dispose();
それはバグのようになります。それはあなたの問題があるが、あなたは、あなたがそれを作成した直後にコマンドを配置した場合
最初のイベントコールの後でSqlDependencyを再度開始する必要があります。 2回目のイベントなどでは壊れません。それは完全に動作します。 – adnan