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()
。你也应该给Start
和Stop
一个队列名称
【参考方案1】:
我最终使用了开箱即用的 SqlDependencyEx!我注意到它明确地将超时设置为 60000 秒,所以也许这对 SqlDependency 也有帮助,但据我了解,我不需要设置类似的东西。
【讨论】:
以上是关于SQLDependency 超时的主要内容,如果未能解决你的问题,请参考以下文章
SqlDependency/Query 通知 - SQL Server 重新启动
使用SqlDependency与表的定期轮询(对性能的影响)
在作为 Windows 服务托管的 WCF 类库项目中使用 SqlDependency