c# - 我无法触发 SqlDependency,我做错了什么吗?
问题描述
我正在尝试设置一个SqlDependency
,这样我的 Winforms 应用程序就不必通过 1 秒重复选择查询来确定表值是否已更改而使服务器陷入困境。我已经摆脱了我遇到的所有异常,但我仍然无法触发它。
我在数据库中创建了一个队列和一个服务,并且我正在使用一个 SQL Server 帐户,据我所知,该帐户具有所有必需的权限(连接、控制、创建过程、创建队列、创建服务、执行和订阅查询通知)。
InvalidOperationException
当我使用这条线创建依赖项时,我被困了一段时间:
// create the SQL dependency
sqlDependency = new SqlDependency(command);
SqlDataReader reader = command.ExecuteReader();
抛出以下异常:
System.InvalidOperationException:“在不提供选项值的情况下使用 SqlDependency 时,必须在执行添加到 SqlDependency 实例的命令之前调用 SqlDependency.Start()。”
我添加了选项和超时参数,并且该异常停止发生,但我不确定它是否真的解决了根本问题。
这是新行:
// create the SQL dependency
sqlDependency = new SqlDependency(command, "service=RequestUpdateNotifications;", 0);
https://github.com/dotnet/dotnet-api-docs/issues/1670
使用 SQL Server Profiler,我可以看到GetCurrentRequests
“.NET SqlClient Data Provider”()调用了存储过程() ,超时后,“RequestUpdateMessages”( )exec GetCurrentRequests
调用了另一个过程exec sp_executesql N'WAITFOR(RECEIVE TOP (1) message_type_name, conversation_handle, cast(message_body AS XML) as message_body from [RequestUpdateMessages]), TIMEOUT @p2;',N'@p2 int',@p2=60000
我的问题是我不能OnDependencyChange()
开火。我尝试使用我的应用程序通过存储过程更改表中的值,并尝试使用 SSMS 插入/更新值无济于事。希望我错过了一些简单的事情,但我已经在谷歌上搜索和调整了几个小时,但我无法让它工作。
C#
internal DatabaseComms(string databaseIp, string databaseName)
{
connectionString = "Password=****;Persist Security Info=True;User ID=****;InitiaCatalog="
+ databaseName + ";Data Source=" + databaseIp + ";";
SqlDependency.Start(connectionString, "RequestUpdateMessages");
using (SqlConnection sql = new SqlConnection(connectionString))
{
// Setup the SQL Command
SqlCommand command = new SqlCommand("GetCurrentRequests", sql);
command.Connection.Open();
command.CommandType = CommandType.StoredProcedure;
// create the SQL dependency
sqlDependency = new SqlDependency(command, "service=RequestUpdateNotifications;", 0);
// Subscribe to the SqlDependency event.
sqlDependency.OnChange += new
OnChangeEventHandler(OnDependencyChange);
// execute the command
SqlDataReader reader = command.ExecuteReader();
reader.Close();
// Dispose of the command
command.Dispose();
}
}
void OnDependencyChange(object sender, SqlNotificationEventArgs e)
{
throw new NotImplementedException();
}
SQL
ALTER DATABASE ServiceHub SET ENABLE_BROKER;
CREATE QUEUE RequestUpdateMessages;
CREATE SERVICE RequestUpdateNotifications
ON QUEUE RequestUpdateMessages;
解决方案
推荐阅读
- c# - 由于文件格式或文件扩展名无效而无法打开文件的 C# Web API 导出 excel 文件的问题
- algorithm - 如何使用powershell从文件夹>子文件夹打印文件
- python - 如何为每个学生插入正确的价值,为每个核心价值选择每个分数
- hadoop - 计算键和数字格式的出现次数
- r - 如何在 R Shiny 中将反应值设置为默认值?
- django - django:ManyToMany:更新和插入业务规则
- azure - ARM 模板,服务器名称已存在但实际上不存在
- java - 后台服务不停止 Android
- amazon-web-services - AWS Glue Crawler 更新现有目录表非常慢
- java - 我有一个构造函数,它应该以一个字符串为例,一个地址并用“|”分割