Announcement

Collapse
No announcement yet.

Datenbank Überwachung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Datenbank Überwachung

    Hallo allerseits,

    ich muss folgendes Problem lösen:
    Überwachung auf Datenänderungen von mehreren Sichten/Tabellen, danach soll einer .Net Anwendung ein Ereignis mitgeteilt werden dass es Änderungen der Datenbasis gegeben hat, worauf die aktuellen Daten durch die Anwendung aus der Datenbank geladen werden.

    Wie kann ein solches Problem gelöst werden? Ist die Verwendung von Notification Services sinnvoll oder die Verwendung von Triggern?
    Ich bin leider noch ein Anfänger auf diesem Gebiet und wäre für jeden Ansatz dankbar.

    Grüße und Vielen Dank im Voraus,
    Rahn

  • #2
    Ich hatte ein ähnliches Problem, nur mit Tabellen, ohne Sichten. Gelöst habe ich es so, dass ich auf jede Tabelle, die ich überwachen wollte, einen Trigger gesetzt habe, der einen Eintrag in einer anderen Tabelle geschrieben hat. Die hat den sinnigen Namen CHANGES bei mir, aber das nur nebenbei :-) Das .NET-Programm hat dann Änderungen an dieser Tabelle über eine SqlDependency abonniert, und bei jeder Änderung die Abfrage neu gezogen.

    Funktioniert bestens.

    Gruß,
    Martin

    Comment


    • #3
      Hallo,

      im Namespace System.Data.SqlClient ist die Klasse SqlDependency enthalten, mit der sich die .NET-Anwendung über Veränderungen an der Ergebnismenge einer Abfrage informieren lassen kann.

      Der SQL Server 2005 stellt eine Standardimplementierung für die Query Notification zur Verfügung, indem der Service Broker den Contract PostQueryNotification für den Nachrichtentyp QueryNotification vordefiniert. Das Gegenstück auf der Clientseite besteht in der Klasse SqlDependency . Zusätzlich kapselt ASP.NET 2.0 die Klasse SqlDependency durch die Klasse SqlCacheDependency ein, um das Hantieren für ASP.NET 2.0-Anwendungen zu vereinfachen.

      Ein Mini-Beispiel sieht in C# so aus:
      [highlight=C#]
      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Data;
      using System.Drawing;
      using System.Text;
      using System.Windows.Forms;
      //
      using System.Data.SqlClient;

      namespace QueryNotificationCS
      {
      public partial class Form1 : Form
      {
      public Form1()
      {
      InitializeComponent();
      }

      private const string cCS = "Data Source=P4W2K;Initial Catalog=ServiceBrokerDB;Integrated Security=True";
      private const string cSQL = "SELECT id,wert,zeit FROM dbo.DemoTbl";

      private void Button1_Click(object sender, EventArgs e)
      {
      SqlConnection aCon = new SqlConnection(cCS);
      SqlCommand aCmd = new SqlCommand(cSQL, aCon);
      SqlDependency aDep = new SqlDependency(aCmd);
      aDep.OnChange += new OnChangeEventHandler(aDep_OnChange);
      SqlDependency.Start(cCS);
      aCon.Open();
      SqlDataReader aDR = aCmd.ExecuteReader();
      while(aDR.Read())
      {
      ListBox1.Items.Add(aDR.GetString(1));
      }
      aDR.Close();
      aCon.Close();
      }

      delegate void SetListBoxDelegate(string sMsg);

      void aDep_OnChange(object sender, SqlNotificationEventArgs e)
      {
      string sMsg = String.Format("Typ:{0}; Quelle:{1}; Info:{2}",
      e.Type, e.Source, e.Info);
      ISynchronizeInvoke aSync = ListBox1;
      SetListBoxDelegate aDel = delegate(string sTxt)
      {
      ListBox1.Items.Add(sTxt);
      };
      aSync.Invoke(aDel, new object[] {sMsg});
      }
      }
      }
      [/highlight]

      Comment

      Working...
      X