2016-08-05 2 views
0

テーブルに新しい行があるかどうかを知りたい。どうすればいいですか?VB.NetMySQLの新しいデータを監視するテーブル

例アンInsert QueryMessageBoxが プロンプト私のテーブルに挿入された新しいデータがあることを私に言ってますそして引き金となってきました。

そのできれば誰かが説明し、私はそれを行うことができますどのように私に言うことができますか? (コードがあれば良いでしょう:3

+0

ストア変数にあなたのテーブルの最後のIDの値。次に、タイマーからテーブルのIDを照会し、変数に格納されているIDと比較します。それらが等しい場合、新しいデータが挿入されます。また、変数の値よりも高いすべてのIDを取得して、挿入されたすべての行を取得することもできます。 –

+0

毎秒、変数に格納する最後のIDがトリガーされ、そのIDを条件にします。その論理に良いと思われる。ありがとう@ F0r3v3r-A-N00b – TKGhoul

+0

どちらのエンジンをお使いですか? InnoDBとMyISAMが最も一般的ですが、他にもあります。変更だけを検出する方法はありますが、エンジンに依存します。 – Plutonix

答えて

1

あなたの質問は不明です。 1つのタイプの変更のみを監視する - タイトルごとに "新しいデータ"(INSERT)は、(より簡単なコメントのI want to detect the Changes in my table)のように、の変更よりも複雑です。これらの戻り値の変化を見て

enter image description here

checksum table TABLE_NAME [QUICK | EXTENDED] 
のInnoDBとMyISAMのテーブルのための

のMySQL Workbenchの結果:

MySqlは、テーブルのチェックサムを取得するための手段を提供します変更を検出することができます。しかし、注意してください。

  • テーブルが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")) 

タイマーTickイベント:

' 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

が実際に挿入のみのようなものを監視するには、ログテーブルのいくつかの並べ替えを使用する必要があるだろう。そのテーブルをTimeStampとアクションコード( "insert"、 "delete")で更新するトリガを追加します。次に、TimeStampで変更をチェックします。おそらく時計以外のアクションを除外します。

特に、複数の表や特定の変更イベントを監視するバージョンは、クラスとして機能します。タイマーコードはカプセル化することができ、テーブル変更のイベントを発生させる可能性があります。

関連する問題