-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

この後、私は単に変更された関数を持っています。これがそれを必要とする人に役立つことを願っています。

ファイルシステム/ファイル

ファイルパスとシステムパスの場合、上記のコードは、ファイルの特定のタイプまたは名前を取得するために異なるパスとフィルターを使用するだけで非常に似ています。これらが変更/変更されている場合、これによりコードが実行されます。誰かがこれのためのコードを望むならば、コメントを書いてください、そして、私はいくつかを供給することができます。

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ページがたくさんあります。

于 2012-09-19T08:49:15.873 に答える