【发布时间】: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一个队列名称
标签: c# sql sql-server sqldependency