возможно несколько sqldependancy в vb.net? - PullRequest
0 голосов
/ 29 января 2012

В основном мой код основан здесь http://www.dreamincode.net/forums/topic/185244-using-sqldependency-to-monitor-sql-database-changes/

В настоящее время у меня есть 2 таблицы, которые нужно отслеживать, поэтому я просто дублирую другой аналогичный код с первой sqldependancy, но он не выполнен и выглядит как последнийsqldependancy заменит предыдущую функцию sqldependancy.

вот мой код

 Public Sub GetNames()
        If Not DoesUserHavePermission() Then
            Return
        End If


        lbQueue.Items.Clear()

        ' You must stop the dependency before starting a new one.
        ' You must start the dependency when creating a new one.
        Dim connectionString As String = GetConnectionString()
        SqlDependency.Stop(connectionString)
        SqlDependency.Start(connectionString)


        Using cn As SqlConnection = New SqlConnection(connectionString)

            Using cmd As SqlCommand = cn.CreateCommand()

                cmd.CommandType = CommandType.Text
                cmd.CommandText = "SELECT PatientID FROM dbo.[patient_queue]"

                cmd.Notification = Nothing

                ' creates a new dependency for the SqlCommand
                Dim dep As SqlDependency = New SqlDependency(cmd)
                ' creates an event handler for the notification of data changes in the database
                AddHandler dep.OnChange, AddressOf dep_onchange

                cn.Open()

                Using dr As SqlDataReader = cmd.ExecuteReader()

                    While dr.Read()

                        lbQueue.Items.Add(dr.GetInt32(0))
                        doctor.lbqueue.items.add(dr.GetInt32(0))

                    End While

                End Using

            End Using

        End Using
    End Sub

    Private Sub dep_onchange(ByVal sender As System.Object, ByVal e As System.Data.SqlClient.SqlNotificationEventArgs)

        ' this event is run asynchronously so you will need to invoke to run on the UI thread(if required)
        If Me.InvokeRequired Then

            lbQueue.BeginInvoke(New MethodInvoker(AddressOf GetNames))
            My.Computer.Audio.PlaySystemSound(Media.SystemSounds.Asterisk)

        Else

            GetNames()

        End If

        ' this will remove the event handler since the dependency is only for a single notification
        Dim dep As SqlDependency = DirectCast(sender, SqlDependency)
        RemoveHandler dep.OnChange, AddressOf dep_onchange

    End Sub


    Public Sub GetMedID()
        If Not DoesUserHavePermission() Then
            Return
        End If


        lbMedQueue.Items.Clear()

        ' You must stop the dependency before starting a new one.
        ' You must start the dependency when creating a new one.
        Dim connectionString As String = GetConnectionString()
        SqlDependency.Stop(connectionString)
        SqlDependency.Start(connectionString)


        Using cn As SqlConnection = New SqlConnection(connectionString)

            Using cmd As SqlCommand = cn.CreateCommand()

                cmd.CommandType = CommandType.Text
                cmd.CommandText = "SELECT RecordID FROM dbo.[medicine_queue]"

                cmd.Notification = Nothing

                ' creates a new dependency for the SqlCommand
                Dim dep As SqlDependency = New SqlDependency(cmd)
                ' creates an event handler for the notification of data changes in the database
                AddHandler dep.OnChange, AddressOf dep_onchange2

                cn.Open()

                Using dr As SqlDataReader = cmd.ExecuteReader()

                    While dr.Read()

                        lbMedQueue.Items.Add(dr.GetInt32(0))


                    End While

                End Using

            End Using

        End Using
    End Sub


    Private Sub dep_onchange2(ByVal sender As System.Object, ByVal e As System.Data.SqlClient.SqlNotificationEventArgs)

        ' this event is run asynchronously so you will need to invoke to run on the UI thread(if required)
        If Me.InvokeRequired Then

            lbMedQueue.BeginInvoke(New MethodInvoker(AddressOf GetMedID))
            My.Computer.Audio.PlaySystemSound(Media.SystemSounds.Asterisk)

        Else

            GetMedID()

        End If

        ' this will remove the event handler since the dependency is only for a single notification
        Dim dep As SqlDependency = DirectCast(sender, SqlDependency)
        RemoveHandler dep.OnChange, AddressOf dep_onchange2

    End Sub

наконец я вызвал GetNames, GetMedID в форме загрузки, все работало нормально, только GetMedID работает, а GetNames делаетне срабатывает при смене.

Ответы [ 2 ]

1 голос
/ 01 февраля 2014

Я думаю, что вы правы, я столкнулся с той же проблемой.Второй вызов SqlDependency.Start (connectionString), даже после New SqlDependency (cmd), заменил существующую исходную службу Service Broker и очередь по умолчанию.

Service Broker создает службу и очередь по умолчанию при каждом запуске, используяидентификатор GUID как часть имен службы и очереди: служба {GUID} и очередь {GUID} - но, по-видимому, существует только одна доступная пара «служба / очередь»

Это можно проверить, поставив точку останова.указать сразу после первого запуска и сразу после второго запуска.Перейдите на SQL Server, перейдите в базу данных dBase и посмотрите на папки Service Broker / Services и Service Broker / Queues.Вам нужно будет щелкнуть правой кнопкой мыши папки «Службы» и «Очереди» и выбрать обновление после второй точки останова

1 голос
/ 09 февраля 2012

Я думаю, что главная проблема здесь в том, что вы вызываете .Stop, а затем .Start в каждом из ваших методов доступа к данным, таким образом отменяя и перезапуская зависимость каждый раз, когда вы получаете доступ к методам.

Вам просто нужно позвонить .Start один раз, когда ваше приложение запускается, и аналогично .Stop, когда оно заканчивается.

Например, в веб-приложении лучшим местом для этого являются события Global.asax Application_Start и Application_End.

...