我知道,我知道有很多关于这个主题的出版物,但没有一个能解决我的问题,这个问题就像运动一样简单,没什么特别的。
基本上,所有关于无效SqlDependency
的Google结果,无论是在SO还是其他任何地方都遵循相同的方法。我遵循的最后一个位于here。在这里:
在数据库级别启用SQL Service Broker
ALTER DATABASE Test SET ENABLE_BROKER
结果通过以下方式验证:
SELECT Name, is_broker_enabled FROM sys.databases
这一切看起来都像mi一样。
接下来是C#代码。我创建了一个控制台应用程序,所有内容都发生在static void Main(...
static void Main(string[] args)
{
if (CanRequestNotifications())
{
var cs = ConfigurationManager.ConnectionStrings["Test"].ConnectionString;
SqlDependency.Stop(cs);
SqlDependency.Start(cs);
using (var cnn = new SqlConnection(cs))
using (var cmd = cnn.CreateCommand())
{
cnn.Open();
cmd.CommandText = "SELECT Id, Name FROM [dbo].[Device]";
cmd.Notification = null;
var x = new SqlDependency();
x.OnChange += X_OnChange;
using (var r = cmd.ExecuteReader())
{
}
Console.ReadLine();
}
SqlDependency.Stop(cs);
}
else
{
Console.WriteLine("Access denied.");
Console.ReadLine();
}
}
static bool CanRequestNotifications()
{
var result = false;
var perm = new SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted);
try
{
perm.Demand();
result = true;
}
catch (Exception)
{
throw;
}
return result;
}
private static void X_OnChange(object sender, SqlNotificationEventArgs e)
{
Console.WriteLine("{0}: ChangeDetected...", DateTime.Now);
}
正如你所看到的那样,这不是一个权限问题,因为我检查了之前启动监听器的情况。
我的配置是这样的:
<connectionStrings>
<add name="Test" providerName="System.Data.SqlClient"
connectionString="Data Source=(localdb)\v11.0;
Initial Catalog=TEST;Integrated Security=True" />
</connectionStrings>
我在多篇文章中读到,经纪人可以使用MS SQL服务器的快速版本正常工作;我尝试了SQL Express 2014和MSSQLLocalDB - 相同的区别。我正在使用VS 2015,并且我通过其SQL Server对象资源管理器发出命令(这有关系吗?)在程序启动后按F5 - 调试模式。我得到的只是一个空白的控制台;没有错误,没有任何错误。然后我在VS中从SSOE执行以下语句但仍然没有:
INSERT INTO Device(Name, MakerId, ComputerId) VALUES ('dfhj', 1, 1)
UPDATE [dbo].[Device] SET Name = 'dfhdfh' WHERE Id = 1
有什么问题?