mysql - 监控MySQL表中的新数据

标签 mysql .net vb.net

我想知道我的表中是否有新行。我怎样才能在VB.Net中做到这一点?

Example An Insert Query has triggered then a MessageBox will prompt telling me that there's new data inserted in my table.

如果可能的话有人可以解释一下并告诉我该怎么做吗? (如果有代码就更好了:3)

最佳答案

您的问题仍然不清楚。仅监视一种类型的更改 - 根据标题的“新数据”(INSERT) - 比检测任何更改(根据我想检测表中的更改 在注释中,这更简单)。

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

checksum table TABLE_NAME [QUICK | EXTENDED]

InnoDB 和 MyISAM 表的 MySQL Workbench 结果:

enter image description here

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

  • 该表必须是使用 Checksum = 1 选项创建的
  • QUICK 选项不适用于 5.7.2 版本之前的 InnoDB 表(IIRC 和当前社区版本为 5.7.14)。

幸运的是,如果您不指定选项,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

我的 do some 方法只是将更改报告到列表框:

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

要真正监视诸如插入之类的内容,您需要使用某种日志表。添加一个触发器,用时间戳和操作代码(“插入”、“删除”)更新该表。然后只需检查时间戳是否有更改,也许可以过滤掉非观看操作。

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

关于mysql - 监控MySQL表中的新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38779607/

相关文章:

php - 使用php的Mysql选择查询结果为空行值

mysql - 按两列分组

c# - 战舰 AI - 完全迷失

c# - 绑定(bind)到 IList,但得到 "Complex DataBinding accepts as a data source either an IList or an IListSource"

php - 使用 Phinx 添加外键

php - Laravel - Valet 2.* 只返回 'it works!'

c# - ASP.NET MVC 3 - 在 View 中处理模型的最佳实践

asp.net - 下拉列表中有重复的项目!

asp.net - 两个外键引用相同的主键

.net - 使用 VB.Net 获取实现特定接口(interface)的所有类类型