SQLDependency 超时

Posted

技术标签:

【中文标题】SQLDependency 超时【英文标题】:SQLDependency times out 【发布时间】:2021-12-10 09:31:10 【问题描述】:

我试图在我的 WPF 应用程序中更改我的 SQL Server 表时收到通知,大约 20 秒后我收到一个超时过期异常,然后

数据库中已经有一个名为“SqlQueryNotificationStoredProcedure-random id”的对象。

之后我得到了这个:

找不到存储过程“SqlQueryNotificationStoredProcedure-...”。 找不到队列“SqlQueryNotificationService-...”,因为它不存在或您没有权限。 无效的对象名称“SqlQueryNotificationService-...”

然后:

找不到对话句柄“id...”。 找不到对话句柄“id...”。

大多数时候只有超时和“已经是一个名为..的对象”异常显示,然后,如果我忽略这些异常并继续,SqlDependency 之后仍然可以正常工作,我也尝试过SqlTableDependency但是那个我无法工作,我迷路了......我真的很感激任何帮助!

这是SqlDependency的代码:

public static void StartDependency()

        using (var dbconn = new SqlConnection(ConnStr))
        
            dbconn.Open();

            using (SqlCommand command = new SqlCommand(*my select command*, dbconn))
            
                SqlDependency dependency = new SqlDependency(command);
                dependency.OnChange += new OnChangeEventHandler(OnDependencyChange);

                using (SqlDataReader reader = command.ExecuteReader())
                

                
            
        


private static void OnDependencyChange(object sender, SqlNotificationEventArgs e)

        SqlDependency dependency = sender as SqlDependency;
        dependency.OnChange -= OnDependencyChange;
        Console.WriteLine(e.Source);
        Console.WriteLine(e.Info);
        Console.WriteLine(e.Type);
        StartDependency();

在启动时我会这样做:

SqlDependency.Start(ConnStr);

AppDomain.CurrentDomain.UnhandledException += (s, e) =>  SqlDependency.Stop(ConnStr); ;
Application.Current.MainWindow.Closing += (s, e) =>  SqlDependency.Stop(ConnStr); ;

StartDependency();

编辑:即使我不在 UnhandledException 上调用“SQLDependency.Stop(ConnStr)”,它仍然会引发相同的异常,并且我在 .NET 5 上使用最新的 System.Data.SqlClient。

【问题讨论】:

在你的真实代码中,command.ExecuteReader() 之后你真的对阅读器做任何处理吗?你真的应该有while(reader.Read())。因为否则你应该只做command.ExecuteNonQuery()。你也应该给StartStop一个队列名称 【参考方案1】:

我最终使用了开箱即用的 SqlDependencyEx!我注意到它明确地将超时设置为 60000 秒,所以也许这对 SqlDependency 也有帮助,但据我了解,我不需要设置类似的东西。

【讨论】:

以上是关于SQLDependency 超时的主要内容,如果未能解决你的问题,请参考以下文章

SqlDependency类的使用

SqlDependency/Query 通知 - SQL Server 重新启动

使用SqlDependency与表的定期轮询(对性能的影响)

在作为 Windows 服务托管的 WCF 类库项目中使用 SqlDependency

SqlDependency通知sql server 2005不会在多个插入上触发

如何从 SQL Server 内存中清除 SqlDependency?