2012-01-29 2 views
0

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

Текущая ситуация я имею 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 не стреляя событие, когда OnChanged.

ответ

1

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

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

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

1

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

Сервисный брокер создает Службу обслуживания и очередь по умолчанию при каждом запуске, используя GUID как часть имен службы и очереди: Service {GUID} и Queue {GUID} - но, похоже, существует только одна defualt Service/Queue pair доступно

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