アクセスとファイルシステム/ファイル
アクセスポイントには、SystemFileWatcherを使用しました。これにより、データベースが監視され、データベースが変更されている場合は、コードを実行してデータベースから新しいデータを取得します。これは、アプリケーションが常にデータベースにアクセスし、不要なときに新しいデータを取得するわけではないことを意味します。
FileSystemWatcherは、名前の変更、移動、変更などのイベントとは異なるコードを実行できます。私は変更されたものを使用する必要があるだけです。使用しているXMLファイルからデータベースパスを取得しました。これは、ハードコーディングされておらず、xmlファイルから変更できることを意味し、ウォッチャーは他の場所を監視します。
Protected Overrides Sub OnStart(ByVal args() As String)
Dim g1 As New FileSystemWatcher()
g1.Path = GetSingleNode(XmlFileName, "data/G1Path")
g1.NotifyFilter = (NotifyFilters.LastAccess Or NotifyFilters.LastWrite Or NotifyFilters.FileName Or NotifyFilters.DirectoryName)
g1.Filter = GetSingleNode(XmlFileName, "data/G1Filter")
AddHandler g1.Changed, AddressOf OnChanged
g1.EnableRaisingEvents = True
Dim g2 As New FileSystemWatcher()
g2.Path = GetSingleNode(XmlFileName, "data/G2Path")
g2.NotifyFilter = (NotifyFilters.LastAccess Or NotifyFilters.LastWrite Or NotifyFilters.FileName Or NotifyFilters.DirectoryName)
g2.Filter = GetSingleNode(XmlFileName, "data/G2Filter")
AddHandler g2.Changed, AddressOf OnChanged
g2.EnableRaisingEvents = True
End Sub
Protected Overrides Sub OnStop()
End Sub
Public Shared Function GetSingleNode(ByVal xmlPath As String, ByVal nodeLocation As String) As String
Try
Dim xpathDoc As New XPathDocument(xmlPath) 'gets the nodes from the XML file ready to be put in to the network path/variables
Dim xmlNav As XPathNavigator = xpathDoc.CreateNavigator()
Return xmlNav.SelectSingleNode(nodeLocation).Value
Catch ex As Exception
Throw
End Try
End Function
この後、私は単に変更された関数を持っています。これがそれを必要とする人に役立つことを願っています。
ファイルシステム/ファイル
ファイルパスとシステムパスの場合、上記のコードは、ファイルの特定のタイプまたは名前を取得するために異なるパスとフィルターを使用するだけで非常に似ています。これらが変更/変更されている場合、これによりコードが実行されます。誰かがこれのためのコードを望むならば、コメントを書いてください、そして、私はいくつかを供給することができます。
SQLデータベース
SQLデータベースでは、データが変更されているかどうかを確認する方法が複数あります。これらに情報を提供するために、いくつかのMSDNページと別の質問を参照します。ただし、サービスブローカーを実行しておらず、SQLデータベースでキューが有効になっていないため、使用方法が少し異なります。
SQL Serverテーブル用のFileSystemWatcherのようなものはありますか?
http://msdn.microsoft.com/en-us/library/62xk7953.aspx#Y342
ただし、私が使用した方法は、チェックサムとタイマーを使用し、ループでチェックサムをチェックして、データベースが変更されたかどうかを確認することでした。データが変更されると、「ハッシュ」は常に変更されるため、次のようになります。
http://sqlserverplanet.com/design/how-to-detect-table-changes
http://www.mssqltips.com/sqlservertip/1023/checksum-functions-in-sql-server-2005/
私のコード:
'メイン内で、後日、最初のチェックサム値を一緒にマップできるようにします。これらはグローバル変数です
Dim newdata As DataTable = SQLMethods.ExecuteReader(ConnectionString1, "SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM Alarms")
checksum = newdata.Rows(0).Item(0)
Timer1.Start()
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Timer1.Stop()
Dim newdata As DataTable = SQLMethods.ExecuteReader(ConnectionString1, "SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM Alarms")
checksumNew = newdata.Rows(0).Item(0)
If checksum <> checksumNew Then
MsgBox("Hello")
checksum = checksumNew
End If
Timer1.Start()
End Sub
一致するかどうかを確認できるように、チェックサムは一致するように変更されるため、次に発生するときは、データベースが実際に変更されない限り、同じになります。メッセージボックスの混乱を避けるために、時間を停止してから再開しましたが、ここでイベントが発生したり、データベースが変更された場合にコードが発生したりする可能性があるため、メッセージボックスはデバッグ目的で使用されます。
オラクル
調査を行った後、このソリューションを自分のアプリケーションに実装することはできませんでしたが、他のユーザーに情報を提供できることを願っています。Oracleには、選択したデータが変更された場合にアプリケーションに通知を提供するOracleDependencyClassと呼ばれるものがあります。誰かが私自身の研究を反映する必要がないことを願って、いくつかの例とこれらの使用方法の基本を含むいくつかのハイパーリンクを提供します。
データベース変更通知を使用したアプリケーションの開発
OracleDependencyクラス
Oracle®DataProviderfor.NET開発者ガイド-OracleDependencyClass(2)
C#およびVB.NETでのクラスの使用例
これらのページが役に立たない場合は、「oracle依存関係」、「OracleDependencyクラス」、および「データベース変更通知」のいずれかを検索した場合にアクセスできる他のWebページがたくさんあります。