SQL依赖关系OnChange事件在页面刷新原因上多次调用

时间:2016-08-05 13:43:41

标签: c# sql-server

任何机构都能告诉我在页面刷新后多次SQL依赖 OnChange 事件调用背后的原因是什么。这背后可能的原因是什么?在页面刷新之前,数据库中每次更改只调用一次。

2 个答案:

答案 0 :(得分:6)

问题:每当我创建一个新的SQL Dependency变量时刷新页面,并且还有一个新的Change_Event_Handler与该新的依赖变量相关联,并且当调用SQL依赖项时,它必须取消订阅所有多次调用我的函数的现有更改事件。

解决方案:在课堂上将这两个变量定义为静态:

    internal static SqlCommand command = null;
    internal static SqlDependency dependency = null;

然后使用这样的函数,并在应用程序启动时首先停止依赖,然后再次启动,然后执行其他类似的操作。 检查是否已启动依赖项,然后不创建新的依赖关系连接和类似的新ChangeEvent,

    using (EmailController.command = new SqlCommand(SQL.emailmessagesbyaccount_sql(), conn.getDbConnection()))
    {
        defaultemailid = emailid;
        EmailController.command.Parameters.Add(new SqlParameter("@emailaccountid", emailid));

        EmailController.command.Notification = null;

        if (EmailController.dependency == null)
        {
            EmailController.dependency = new SqlDependency(EmailController.command);
            EmailController.dependency.OnChange += new OnChangeEventHandler(emailMessages_OnChange);
        }
        var reader = EmailController.command.ExecuteReader();
    }

最后你必须像这样实现onchange_event:

private void emailMessages_OnChange(object sender, SqlNotificationEventArgs e)
{
    if (e.Type == SqlNotificationType.Change)
    {
        //if not null then unsubscribe the calling event
        if (EmailController.dependency != null)
        {
            EmailController.dependency.OnChange -= emailMessages_OnChange;
        }
        //do my email updates
        NotificationHub.EmailUpdateRecords();


        // here again subscribe for the new event call re initialize the
        // exising dependecy variable the one which we defined as static

        SingletonDbConnect conn = SingletonDbConnect.getDbInstance();
        using (EmailController.command = new SqlCommand(SQL.emailmessagesbyaccount_sql(), conn.getDbConnection()))
        {
            EmailController.command.Parameters.Add(new SqlParameter("@emailaccountid", defaultemailid));
            EmailController.command.Notification = null;

            EmailController.dependency = new SqlDependency(EmailController.command);
            EmailController.dependency.OnChange += new OnChangeEventHandler(emailMessages_OnChange);

            var reader = EmailController.command.ExecuteReader();

        }

    }
}

实际上这是我的代码逻辑,但是希望你能从这个实现中得到很好的想法,如何处理这个问题让我磕磕绊绊了一个星期。

答案 1 :(得分:2)

我遇到了同样的问题,@ usman的答案对我帮助很大。我稍微改变了dependency_OnChange方法的逻辑。

        private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
        {
          if (dependency != null)
          {
              dependency.OnChange -= dependency_OnChange;
              dependency = null;
          }
          if (e.Type == SqlNotificationType.Change)
          {
              MessagesHub.SendMessages();
          }
        }

如果依赖项不为null,我将依赖项设置为null。如果我们不将其设置为null,则会在每次页面刷新时触发,如果页面多次打开或从多个浏览器打开。由于@usman确实将依赖项定义为内部静态,并在onChange方法中将依赖项设置为null。这让我很快乐。希望它可以帮助另一个面临同样问题的人。