SQL依赖项OnChange事件多次调用页面刷新原因
本文关键字:刷新 调用 依赖 OnChange 事件 SQL | 更新日期: 2023-09-27 18:01:04
有人能告诉我在页面刷新后多次调用SQL依赖性OnChange事件背后的原因吗。这背后可能的原因是什么?在刷新页面之前,数据库中每次更改只调用一次。
问题:每次创建新的SQL依赖变量以及与该新依赖变量关联的新Change_Event_Handler时,当调用SQL依赖时,它必须取消订阅对我的函数进行多次调用的所有现有更改事件。
解决方案:在类中将这两个变量定义为静态
internal static SqlCommand command = null;
internal static SqlDependency dependency = null;
然后使用这样的函数,在应用程序启动时,首先停止依赖项,然后重新启动,然后做其他类似的事情。检查依赖关系是否已经启动,然后不要创建新的依赖关系连接和类似的新ChangeEvent,
using (EmailController.command = new SqlCommand(SQL.emailmessagesbyaccount_sql(), conn.getDbConnection()))
{
defaultemailid = emailid;
EmailController.command.Parameters.Add(new SqlParameter("@emailaccountid", emailid));
EmailController.command.Notification = null;
if (EmailController.dependency == null)
{
EmailController.dependency = new SqlDependency(EmailController.command);
EmailController.dependency.OnChange += new OnChangeEventHandler(emailMessages_OnChange);
}
var reader = EmailController.command.ExecuteReader();
}
最后,您必须实现这样的onchange_event:
private void emailMessages_OnChange(object sender, SqlNotificationEventArgs e)
{
if (e.Type == SqlNotificationType.Change)
{
//if not null then unsubscribe the calling event
if (EmailController.dependency != null)
{
EmailController.dependency.OnChange -= emailMessages_OnChange;
}
//do my email updates
NotificationHub.EmailUpdateRecords();
// here again subscribe for the new event call re initialize the
// exising dependecy variable the one which we defined as static
SingletonDbConnect conn = SingletonDbConnect.getDbInstance();
using (EmailController.command = new SqlCommand(SQL.emailmessagesbyaccount_sql(), conn.getDbConnection()))
{
EmailController.command.Parameters.Add(new SqlParameter("@emailaccountid", defaultemailid));
EmailController.command.Notification = null;
EmailController.dependency = new SqlDependency(EmailController.command);
EmailController.dependency.OnChange += new OnChangeEventHandler(emailMessages_OnChange);
var reader = EmailController.command.ExecuteReader();
}
}
}
事实上,这是我的代码逻辑,但希望你能从这个实现中得到关于如何处理这类问题的好主意,这让我有一周的时间感到困惑。
我也遇到了同样的问题,@usman的回答对我帮助很大。我稍微改变了dependency_OnChange方法的逻辑。
private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
if (dependency != null)
{
dependency.OnChange -= dependency_OnChange;
dependency = null;
}
if (e.Type == SqlNotificationType.Change)
{
MessagesHub.SendMessages();
}
}
如果依赖项不为null,我会将其设置为null。如果我们不将其设置为null,则在每次页面刷新时,如果页面被多次打开或从多个浏览器打开,它就会被触发。正如@usman所做的那样,它将依赖项定义为内部静态,并在onChange方法中将依赖项设置为null。这是我的一天。希望它能帮助另一个面临同样问题的人。