我想知道我桌子上是否有新行。我怎么能在 VB.Net ?
中做到这一点示例
Insert Query
已触发MessageBox
提示告诉我,我的表格中插入了新数据。
如果有可能,有人可以解释并告诉我该怎么做? (如果有代码会更好<3 )
答案 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结果:
通过观察这些返回值的变化,您可以检测到任何变化。但请注意:
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
要实际观察只有INSERTS的内容,您需要使用某种日志表。添加一个触发器,使用TimeStamp和行动代码更新该表(&#34;插入&#34;,&#34;删除&#34;)。然后只需检查TimeStamp的更改,或者过滤掉非监视操作。
特别是观看多个表或某些更改事件的版本将更好地作为一个类。可以封装定时器代码,它可以引发表更改的事件。