Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL Dependency OnChange事件多次调用页面刷新原因_C#_Sql Server - Fatal编程技术网

C# SQL Dependency OnChange事件多次调用页面刷新原因

C# SQL Dependency OnChange事件多次调用页面刷新原因,c#,sql-server,C#,Sql Server,有谁能告诉我,页面刷新后多次调用SQL DependencyOnChange事件背后的原因是什么。这背后可能的原因是什么?在页面刷新之前,数据库中每次更改只调用一次。问题问题:当我每次刷新页面时,都会创建一个新的SQL依赖项变量以及一个与该新依赖项变量关联的新更改事件处理程序,当调用SQL依赖项时,它必须取消订阅所有对我的函数进行多次调用的现有更改事件 解决方案:在类中将这两个变量定义为静态变量: internal static SqlCommand command = null;

有谁能告诉我,页面刷新后多次调用SQL DependencyOnChange事件背后的原因是什么。这背后可能的原因是什么?在页面刷新之前,数据库中每次更改只调用一次。问题

问题:当我每次刷新页面时,都会创建一个新的SQL依赖项变量以及一个与该新依赖项变量关联的新更改事件处理程序,当调用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_事件,如下所示:

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();

        }

    }
}

事实上,这是我的代码逻辑,但希望您能从这个实现中获得非常好的想法,如何处理这类问题,这让我困惑了一周。

我也遇到了同样的问题,@usman的回答对我帮助很大。我稍微改变了dependency\u 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。这让我很开心。希望它能帮助另一个面临同样问题的人。

您正在检查HasChanges吗?当数据库中有一些更改时,会触发依赖项的OnChange事件,但当数据库中有一些更改时,此事件会在页面刷新后多次触发database@usman嗨,乌斯曼。你找到这个问题的解决方法了吗?我有完全相同的问题。你能帮我吗?是的,我现在解决了这个问题。我在这里发布了一个答案。发布了答案,如果它对你有帮助,请将其标记为答案。非常感谢这个解决方案。我做了类似的事情。:)很高兴帮助你谢谢你@Usman,这是一个很大的麻烦,我甚至还没意识到这是因为再泡沫造成的