每次数据库发生更改时,在vb.net中使用带有命名队列的SqlDependency来填充datagridview

时间:2014-12-11 09:24:50

标签: vb.net datagridview

正在开发一个需要从数据库获取数据并实时发布到主系统的接口。当启动需要实时触发主系统以进行进一步处理的响应时。我正在为使用sql server的应用程序创建一个接口。

我正在尝试将sqldependancy与以下代码一起使用

 Option Strict On
  Option Explicit On

  Imports System.Data.SqlClient
  Imports System.Security.Permissions
  mports System.ComponentModel


Public Class Home

    Private Sub Home_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'TODO: This line of code loads data into the 'BillPaymentsDataSet.Transactions_Temp' table. You can move, or remove it, as needed.
        Me.Transactions_TempTableAdapter.Fill(Me.BillPaymentsDataSet.Transactions_Temp)

    End Sub
    Private Function GetConnectionString() As String

        Return My.Settings.BillPaymentsConnectionString

    End Function

    Sub Initialization()
        Dim con As New SqlConnection(My.Settings.BillPaymentsConnectionString)
        SqlDependency.Start(My.Settings.BillPaymentsConnectionString)

    End Sub
    Private Function CanRequestNotifications() As Boolean

        Dim permission As New SqlClientPermission( _
          PermissionState.Unrestricted)

        Try
            permission.Demand()
            Return True
        Catch ex As Exception
            Return False
        End Try

    End Function
    Private Sub GetData()
        BillPaymentsDataSet = Nothing
        dt = New DataTable()

        BillPaymentsDataSet.Clear()

        SqlDependency.Stop(GetConnectionString())
        SqlDependency.Start(GetConnectionString())

        command.Notification = Nothing

        If con Is Nothing Then
            con = New SqlConnection(GetConnectionString())
        End If
        Dim dependency As New SqlDependency(command)
        AddHandler dependency.OnChange, AddressOf dependency_OnChange
           con.Open()
        Using Transactions_TempTableAdapter As New SqlDataAdapter(command)
            Me.Transactions_TempTableAdapter.Fill(Me.BillPaymentsDataSet.Transactions_Temp)

            Me.DataGridView1.DataSource = BillPaymentsDataSet.Transactions_Temp



        End Using
    End Sub


    Private Sub UserMantainanceToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles UserMantainanceToolStripMenuItem.Click
        UserMantain.Show()


    End Sub

    Private Sub dependency_OnChange( _
     ByVal sender As Object, ByVal e As SqlNotificationEventArgs)

        Dim changeCount As Integer = 0
        Const statusMessage As String = _
  "{0} changes have occurred."
        Dim i As ISynchronizeInvoke = CType(Me, ISynchronizeInvoke)


        If i.InvokeRequired Then
            ' Create a delegate to perform the thread switch
            Dim tempDelegate As New OnChangeEventHandler( _
                AddressOf dependency_OnChange)

            Dim args() As Object = {sender, e}

            ' Marshal the data from the worker thread
            ' to the UI thread.
            i.BeginInvoke(tempDelegate, args)

            Return
        End If

        ' Remove the handler since it's only good
        ' for a single notification
        Dim dependency As SqlDependency = _
            CType(sender, SqlDependency)

        RemoveHandler dependency.OnChange, _
           AddressOf dependency_OnChange

        ' At this point, the code is executing on the
        ' UI thread, so it is safe to update the UI.
        changeCount += 1
        Me.Label1.Text = String.Format(statusMessage, changeCount)

        ' Add information from the event arguments to the list box
        ' for debugging purposes only.
        With Me.ListBox1.Items
            .Clear()
            .Add("Info:   " & e.Info.ToString())
            .Add("Source: " & e.Source.ToString())
            .Add("Type:   " & e.Type.ToString())
        End With

        ' Reload the dataset that's bound to the grid.
        GetData()
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    End Sub
End Class

0 个答案:

没有答案