-1

在我为所有应用程序从该数据库中提取信息工作的公司中,我决定写一个详细的答案来回答不同的数据库如何让用户知道它们已被更改。我将回答以下类型:

  • 使用权
  • SQL
  • 甲骨文
  • 文件系统(文件和文件夹)

我为什么要这样做?......我工作的公司有许多不同的数据库和使用这些数据库的应用程序。然而,应用程序花费大量时间在数据库中检查数据是否已更改。我已编写此列表以显示某些数据库/文件如何使用不同的工具让应用程序知道它已被更改。所以可以触发一个事件。这有望降低计算能力并加速应用程序。

请按您认为合适的方式进行编辑。如果您需要任何其他信息,请发表评论。我仍在添加 Oracle 数据库解决方案并编辑 Access 和 SQL。

4

1 回答 1

0

访问和文件系统/文件

对于接入点,我使用了 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”,您可以访问许多其他网页。

于 2012-09-19T08:49:15.873 回答