监视MySQL表中的新数据

时间:2016-08-05 01:00:24

标签: mysql .net vb.net

我想知道我桌子上是否有新行。我怎么能在 VB.Net

中做到这一点
  

示例Insert Query已触发MessageBox   提示告诉我,我的表格中插入了新数据。

如果有可能,有人可以解释并告诉我该怎么做? (如果有代码会更好<3

1 个答案:

答案 0 :(得分:1)

你的问题仍不清楚。仅监控一种类型的变更 - &#34;新数据&#34; (INSERT)根据标题 - 比检测任何更改更复杂(在评论中按照I want to detect the Changes in my table更简单)。

MySql提供了获取表格校验和的方法:

checksum table TABLE_NAME [QUICK | EXTENDED]

InnoDB和MyISAM表的MySQL Workbench结果:

enter image description here

通过观察这些返回值的变化,您可以检测到任何变化。但请注意:

  • 必须使用Checksum = 1选项
  • 创建表格
  • QUICK选项在版本5.7.2(IIRC和当前社区版本为5.7.14)之前的InnoDB表上不起作用。

幸运的是,如果你没有指定一个选项,MySQL似乎选择了最快的一个将返回一个值。因此,通过计时器上的表来跟踪更改变得很容易:

' Track last checksum by table
Friend Class TableItem
    Public Property Name As String
    Public Property CheckSum As Int64

    Public Sub New(n As String)
        Name = n
        CheckSum = 0
    End Sub
End Class
' a list of them to track more than one table:
Private Tables As List(Of TableItem)

初​​始化:

Timer1.Enabled = True

Tables = New List(Of TableItem)
Tables.Add(New TableItem("Sample"))
Tables.Add(New TableItem("SampleISAM"))

计时器勾选事件:

' Note: cannot use Parameters for table or col names
Dim sql = "CHECKSUM TABLE {0} "

Using dbcon As New MySqlConnection(mySQLConnStr)
    dbcon.Open()
    Using cmd As New MySqlCommand(sql, dbcon)
        ' loop thru collection, polling one at a time
        For Each tbl As TableItem In Tables
            cmd.CommandText = String.Format(sql, tbl.Name)

            Using rdr As MySqlDataReader = cmd.ExecuteReader()
                If rdr.Read Then
                    Dim thisResult = rdr.GetInt64(1)

                    ' ignore the first result
                    If tbl.CheckSum = 0 Then
                        tbl.CheckSum = thisResult
                        Return
                    End If
                    ' save the last non-zed value
                    If tbl.CheckSum <> thisResult Then
                        tbl.CheckSum = thisResult
                        ' method to do something when changed:
                        TableChanged(tbl.Name)
                    End If

                End If
            End Using
        Next
    End Using
End Using

我做了一些方法我们只是报告对列表框的更改:

Private Sub TableChanged(tbl As String)
    lb.Items.Add(String.Format("Table {0} changed {1}", tbl,
                               DateTime.Now.ToString("HH:mm:ss.ffffff")))
End Sub

enter image description here

要实际观察只有INSERTS的内容,您需要使用某种日志表。添加一个触发器,使用TimeStamp和行动代码更新该表(&#34;插入&#34;,&#34;删除&#34;)。然后只需检查TimeStamp的更改,或者过滤掉非监视操作。

特别是观看多个表或某些更改事件的版本将更好地作为一个类。可以封装定时器代码,它可以引发表更改的事件。