C# 事件发生时SqlDependency OnChange未触发
我知道有一个类似的问题,所以它有一个答案,在阅读了这篇文章和其他文章之后,我仍然不确定为什么我不能正确地把它连接起来。我已经尝试了很多例子,尝试了不同的东西,但根本无法让它工作。我知道有重构的机会,但我现在正试图保持它的简单,只是为了让它首先工作 我拥有数据库的权限,可以看到创建了一个临时服务和队列。但我注意到的一点是,如果我运行查询,队列不会显示任何记录,并且不会触发我的C# 事件发生时SqlDependency OnChange未触发,c#,sql-server,asp.net-mvc,signalr,sqldependency,C#,Sql Server,Asp.net Mvc,Signalr,Sqldependency,我知道有一个类似的问题,所以它有一个答案,在阅读了这篇文章和其他文章之后,我仍然不确定为什么我不能正确地把它连接起来。我已经尝试了很多例子,尝试了不同的东西,但根本无法让它工作。我知道有重构的机会,但我现在正试图保持它的简单,只是为了让它首先工作 我拥有数据库的权限,可以看到创建了一个临时服务和队列。但我注意到的一点是,如果我运行查询,队列不会显示任何记录,并且不会触发我的dependency\u OnChange事件。我假设它不会被解雇,因为没有任何东西进入队列 更新:我现在正在启动它,但是,
dependency\u OnChange
事件。我假设它不会被解雇,因为没有任何东西进入队列
更新:我现在正在启动它,但是,我得到的唯一事件是订阅
。SqlNotificationEventArgs
为Info
显示Invalid
,但我的查询和表匹配所有SELECT
sql依赖项规则
Global.asax:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
SqlDependency.Start(_entityConnString);
}
protected void Application_End()
{
SqlDependency.Stop(_entityConnString);
}
InfectionPreventionHub.cs:(这是一个简单的信号中心,从特定区域启动)
//
///发送通知。
///
[HubMethodName(“发送更新”)]
私有void SendUpdates()
{
var infectionPreventionItems=InfectionPreventionOperations.GetInfectionPrevention();
var vm=新的InfectionPreventionViewModel
{
传染预防=传染预防项目
};
var result=JsonConvert.SerializeObject(vm);
GetUpdates();
IHubContext context=GlobalHost.ConnectionManager.GetHubContext();
context.Clients.All.receiveUpdates(结果);
}
///
///获取更新。
///
私有void GetUpdates()
{
const string commandText=@“从[TestDb].[dbo].[Association]]中选择[Id],[FirstName]”;
使用(var连接=新的SqlConnection(EntityConnString))
{
connection.Open();
使用(var命令=新的SqlCommand(commandText,connection))
{
command.Notification=null;
var-dependency=newsqldependency(命令);
dependency.OnChange+=新的OnChangeEventHandler(sqlDependency\u OnChange);
if(connection.State==ConnectionState.Closed)
connection.Open();
//注意:您必须执行该命令,否则通知将永远不会触发。
使用(var reader=command.ExecuteReader())
{
}
}
}
}
///
///处理sqlDependency控件的OnChange事件。
///
///事件的来源。
///包含事件数据的实例。
私有void sqlDependency_OnChange(对象发送方,SqlNotificationEventArgs e)
{
//TODO:检查事件的类型
GetUpdates();
SendUpdates();
}
将此连接到RavenDB非常容易,但SqlServer让我很为难
GetUpdates
仅在发生集线器连接时触发一次,我认为这会启动依赖项。但是,在更新或向关联
表中添加内容时,不会引发任何事件。我需要使用signal
进行UI的实时更新,数据将通过第三方工具输入。非常感谢您的帮助。您在更改时使用了哪些控件event@reds我不确定我是否理解这个问题。。。
/// <summary>
/// Sends the notifications.
/// </summary>
[HubMethodName("sendUpdates")]
private void SendUpdates()
{
var infectionPreventionItems = InfectionPreventionOperations.GetInfectionPrevention();
var vm = new InfectionPreventionViewModel
{
InfectionPrevention = infectionPreventionItems
};
var result = JsonConvert.SerializeObject(vm);
GetUpdates();
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<InfectionPreventionHub>();
context.Clients.All.RecieveUpdates(result);
}
/// <summary>
/// Gets the updates.
/// </summary>
private void GetUpdates()
{
const string commandText = @"SELECT [Id], [FirstName] FROM [TestDb].[dbo].[Association]";
using (var connection = new SqlConnection(EntityConnString))
{
connection.Open();
using (var command = new SqlCommand(commandText, connection))
{
command.Notification = null;
var dependency = new SqlDependency(command);
dependency.OnChange += new OnChangeEventHandler(sqlDependency_OnChange);
if (connection.State == ConnectionState.Closed)
connection.Open();
// NOTE: You have to execute the command, or the notification will never fire.
using (var reader = command.ExecuteReader())
{
}
}
}
}
/// <summary>
/// Handles the OnChange event of the sqlDependency control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="SqlNotificationEventArgs"/> instance containing the event data.</param>
private void sqlDependency_OnChange(object sender, SqlNotificationEventArgs e)
{
// TODO: Check for the type of event
GetUpdates();
SendUpdates();
}