Laden...

[SOLVED] SQLDependency OnChange feuert nur zwei mal

Erstellt von RayYago vor 4 Jahren Letzter Beitrag vor 4 Jahren 821 Views
R
RayYago Themenstarter:in
19 Beiträge seit 2019
vor 4 Jahren
[SOLVED] SQLDependency OnChange feuert nur zwei mal

verwendetes Datenbanksystem: SQL Server

Hallo ich spiele gerade mit SQL Dependency herum und habe das Beispiel von MS dazu verwendet:

MS SQLDependency

An sich funktioniert das, aber ich probiere gerade ein wenig aus und wenn ich viele Inserts in kurzer Zeit mache, werden nur max. zwei davon registriert.

*EDIT* Wenn ich das Console.Writeline mit dem neu abbonieren tausche, werden bis zu 20 Einträge registriert. Ist das abbonieren vielleicht zu langsam?**

Das kann doch kein erwünschtes Verhalten sein oder? Ich führe folgendes SQL 180 hintereinander aus:

insert into t3_auftr_log_ll (lade_nr, vg_lfd_nr, status) values(1,2,3)

und habe das Beispiel so bearbeitet das noch eine Connection zur Datenbank geöffnet wird und jedes mal beim Event der Event Handler neu abonniert wird:

class Program
  { 



    private string sampleConnectionString = "Server=DESKTOP-N943R2B\\SQLEXPRESS01;Database = DBDependency; User Id = sa;Password = admin; ";

    SqlConnection conn;

    public static void Main(string[] args)
    {
         var program = new Program();
        program.Initialization();

        Console.ReadLine();
    }

        void Initialization()
        {
            // Create a dependency connection.
            conn = new SqlConnection(sampleConnectionString);        
            RegisterDependencyUsingSpecificQueue();
        }

        private void RegisterDependencyUsingSpecificQueue()
        {
            if (conn.State == ConnectionState.Closed)
            {
                conn.Open();
            }

            SqlDependency.Start(sampleConnectionString);

            using (SqlCommand command = new SqlCommand("SELECT [id],[lade_nr],[vg_lfd_nr],[status] FROM[dbo].[t3_auftr_log_ll]", conn))
        {

            // Create a dependency and associate it with the SqlCommand.
            SqlDependency dependency = new SqlDependency(command);
            // Maintain the reference in a class member.

            // Subscribe to the SqlDependency event.
            dependency.OnChange += new OnChangeEventHandler(OnDependencyChange);

            // Execute the command.
            using (SqlDataReader reader = command.ExecuteReader())
            {
                // Process the DataReader.
            }
        }

    }

    // Handler method
    void OnDependencyChange(object sender, SqlNotificationEventArgs e)
    {
        Console.WriteLine("Got Here!");
            // Handle the event (for example, invalidate this cache entry).
            RegisterDependencyUsingSpecificQueue();
    }

    void Termination()
    {
        // Release the dependency.
        SqlDependency.Stop(sampleConnectionString, "SQLDependencyQueue");
    }
}

Ohne das neu abbonieren geht es nur einmal. Ich kann mir nicht erklären wieso das gerade so ist. Hat da jemand vielleicht eine Idee?

R
RayYago Themenstarter:in
19 Beiträge seit 2019
vor 4 Jahren

Habs herausgefunden, die SQLDependency registriert keine weiteren Notifications solange der Handler noch am arbeiten ist. Das ganze ist für so eine Anzahl an Daten schon bereits nicht gut verwendbar wenn man alle Datensätze haben will.

Was anstatt dessen aber geht ist SqlNotificationRequest

Beispiel hier: SQLNotificationRequest

Persönlich getestet und funktioniert gut auch mit über 100 Inserts in der Sekunde.