访问和文件系统/文件
对于接入点,我使用了 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
在此之后,我只是有一个 on changed 功能。希望这可以帮助任何需要它的人。
文件系统/文件
对于文件路径和系统路径,上面的代码非常相似,只是使用不同的路径和过滤器来获取文件的某些类型或名称。如果这些已更改/修改,这将运行代码。如果有人想要此代码,请写评论,我可以提供一些。
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/
我的代码:
'在 main 中获取第一个校验和值,以便在以后进行比较。这些是全局变量
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 的东西,如果所选数据已被修改,它会向应用程序提供通知。我将提供一些超链接,其中包含一些示例以及如何使用这些示例的基础知识,希望有人不需要反映我自己的研究。
使用数据库更改通知开发应用程序
Oracle依赖类
Oracle® Data Provider for .NET 开发人员指南 - OracleDependency Class(2)
在 C# 和 VB.NET 中使用类的示例
如果这些页面没有帮助,那么如果您搜索“oracle dependency”、“OracleDependency Class”和“Database Change Notification”,您可以访问许多其他网页。