如何确定是否已为Access,SQL,Oracle或文件系统更改了数据库

时间:2012-08-21 12:40:46

标签: database visual-studio-2010 automation

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

  • 访问
  • SQL
  • 甲骨文
  • 文件系统(文件和文件夹)

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

请根据您的需要进行编辑。如果您需要任何其他信息,评论会很棒。我仍在添加Oracle数据库解决方案并编辑Access和SQL。

1 个答案:

答案 0 :(得分: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

在此之后,我只需要一个改变功能。希望这可以帮助任何需要它的人。

的文件系统/文件

对于文件路径和系统路径,上面的代码非常相似,只是使用不同的路径和过滤器来获取文件的某些类型或名称。然后,如果已更改/修改了这些代码,则会运行该代码。如果有人想要这个代码,请写一个评论,我可以提供一些。

SQL数据库

在SQL数据库中,有多种方法可以检查数据是否已更改。我将引用一些MSDN页面以及另一个问题来为这些提供信息。但是我使用的方式略有不同,因为我没有运行服务代理,并且我的SQL数据库上没有启用任何队列。

Is there something like the FileSystemWatcher for Sql Server Tables?

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

进行研究后,我无法在自己的应用程序中实现此解决方案,但希望它能够向其他用户提供信息。在Oracle中有一个名为OracleDependencyClass的东西,如果所选数据已被修改,它会为应用程序提供通知。我将提供一些超链接,其中包含一些示例以及如何使用这些的基础知识,希望有人不需要反映我自己的研究。

Developing Applications with Database Change Notification

OracleDependency Class

Oracle® Data Provider for .NET Developer's Guide - OracleDependency Class(2)

Example of using the class in C# and VB.NET

如果您搜索“oracle dependency”,“OracleDependency Class”和“Database Change Notification”,那么如果这些页面没有帮助,您可以访问许多其他网页。