【问题标题】:sqldependency on change not always firingsqldependency on change 并不总是触发
【发布时间】:2017-01-16 05:28:28
【问题描述】:

这是我的代码:

 Public Sub RegisterNotification()
    Dim conStr As String = ConfigurationManager.ConnectionStrings("sqlConString").ConnectionString
    Dim sqlCommand As String = "SELECT [ID],[Description], [CreateDate], [NoteTypeID] from [note].[Notes]"

    Using con As New SqlConnection(conStr)
        Dim cmd As New SqlCommand(sqlCommand, con)
        If con.State <> System.Data.ConnectionState.Open Then
            con.Open()
        End If
        cmd.Notification = Nothing
        Dim sqlDep As New SqlDependency(cmd)
        AddHandler sqlDep.OnChange, AddressOf sqlDep_OnChange

        Using reader As SqlDataReader = cmd.ExecuteReader()
        End Using
    End Using
End Sub

Private Sub sqlDep_OnChange(sender As Object, e As SqlNotificationEventArgs)
    If e.Type = SqlNotificationType.Change Then
        Dim sqlDep As SqlDependency = TryCast(sender, SqlDependency)
        'Dim id
        RemoveHandler sqlDep.OnChange, AddressOf sqlDep_OnChange

        If e.Info = 1 Then


            Dim notificationHub = GlobalHost.ConnectionManager.GetHubContext(Of NotificationHub)()
            notificationHub.Clients.All.notify("added")
            RegisterNotification()
            'GetNotificationList(0, 1)
        End If


    End If
End Sub

Global.asax 代码:

 Protected Sub Application_Start()
    Try
        Dim _obj As New DAL.sap.Register
        _obj.Register()
        AreaRegistration.RegisterAllAreas()
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters)
        RouteConfig.RegisterRoutes(RouteTable.Routes)
        BundleConfig.RegisterBundles(BundleTable.Bundles)
        WebSecurity.InitializeDatabaseConnection("DefaultConnection", "webpages_UserProfile", "UserId", "UserName", True)


        SqlDependency.Start(con)
    Catch ex As Exception

    End Try



End Sub

Protected Sub Session_Start(sender As Object, e As EventArgs)
    Try
        Dim NC As New NotificationComponent()            
        NC.RegisterNotification()
    Catch ex As Exception

    End Try

End Sub
Protected Sub Application_End()
    Try
        SqlDependency.Stop(con)
    Catch ex As Exception

    End Try

End Sub

启动代码:

<Assembly: OwinStartupAttribute(GetType(www.Startup))>

命名空间 www 部分公开课启动 公共子配置(app As IAppBuilder) app.MapSignalR() 结束子 结束类 结束命名空间

我的问题是 sqldep_onchange 并不总是触发。有时它工作得很好,但有时什么也没有发生。它是一个错误或类似的东西吗?我做错了什么?

【问题讨论】:

    标签: vb.net onchange sqldependency


    【解决方案1】:

    看起来一切都是正确的,虽然我的 VB 非常生锈,但我会尝试删除 SqlNotificationType 上的 if 并查看是否有帮助,它可能过于限制,我还要确保它实际上是依赖项不是开火而是其他东西稍后将其吞噬掉。如果您的 TryCast 失败,还会发生什么?由于它不在尝试中,它不会抛出并且您的通知不会触发并且您的新处理程序不会被添加。

    Private Sub sqlDep_OnChange(sender As Object, e As SqlNotificationEventArgs)
    If e.Type = SqlNotificationType.Change Then
        Dim sqlDep As SqlDependency = TryCast(sender, SqlDependency)
        'Dim id
    
       Delete --> ***RemoveHandler sqlDep.OnChange, AddressOf sqlDep_OnChange*** <--Delete
    
        If e.Info = 1 Then
    
    
            Dim notificationHub = GlobalHost.ConnectionManager.GetHubContext(Of NotificationHub)()
            notificationHub.Clients.All.notify("added")
            RegisterNotification()
            'GetNotificationList(0, 1)
        End If
    
    
    End If
    

    结束子

    【讨论】:

    • 我已经尝试了你的建议,没有任何反应,也没有抛出异常。当我运行我的应用程序时,它运行良好,但可能 10-15 分钟后它不会触发。
    • 检查您是否注册了任何处理程序,让我烦恼的一行代码是您立即删除一个处理程序而不检查是否有多个...如果您删除唯一的处理程序,那么它将停止触发。
    • 对不起,我很难理解英语。你是什​​么意思?你能给我样本作为代码吗?我应该删除“删除处理程序”这一行吗?
    • 尝试删除我标记为删除的行,如果您发现它更频繁地触发,请在删除之前检查是否已经存在处理程序。
    猜你喜欢
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多