Frage

Ich habe Konsolenanwendung, in der ich SqlDependency tue. Mein Problem ist, wenn ich als Text command gesetzt, es gut funktioniert. Aber wenn ich als command StoredProcedure verwenden, wird Onchange Methode aufrufen unendlich.

Bitte beachten Sie den Code unten:



        static DataSet myDataSet;
        static SqlConnection connection;
        static SqlCommand command;

        static void Main(string[] args)
        {

            // Remove any existing dependency connection, then create a new one.
            string connstr = "Data Source=XYZ;Initial Catalog=Dev;Integrated Security=True";
            string ssql = @"[dbo].[SchedulerPendingControlRequestIDFetch]";

            CanRequestNotifications();


            SqlDependency.Stop(connstr);
            SqlDependency.Start(connstr);


            if (connection == null)
                connection = new SqlConnection(connstr);
            if (command == null)
                command = new SqlCommand(ssql, connection);
            command.CommandType = CommandType.StoredProcedure;

            if (myDataSet == null)
                myDataSet = new DataSet();
            GetAdvtData();

            System.Console.ReadKey();
            connection.Close();
        }

        private static bool CanRequestNotifications()
        {
            SqlClientPermission permission =
                new SqlClientPermission(
                PermissionState.Unrestricted);
            try
            {
                permission.Demand();
                return true;
            }
            catch (System.Exception)
            {
                return false;
            }
        }



        private static void GetAdvtData()
        {
            myDataSet.Clear();
            // Ensure the command object does not have a notification object.
            command.Notification = null;
            // Create and bind the SqlDependency object to the command object.
            SqlDependency dependency = new SqlDependency(command,null,100);

            dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);

            using (SqlDataAdapter adapter = new SqlDataAdapter(command))
            {
                adapter.Fill(myDataSet, "ControlRequest");

            }
        }

        private static void dependency_OnChange(object sender, SqlNotificationEventArgs e)
        {
            SqlDependency dependency =
        (SqlDependency)sender;

            dependency.OnChange -= dependency_OnChange;

            Console.WriteLine(e.Info.ToString() + e.Source.ToString());
            GetAdvtData();
        }

Meine gespeicherten Prozedur ist:



IF OBJECT_ID('SchedulerSirasColcoDetailFetch') IS NOT NULL
 DROP PROCEDURE SchedulerSirasColcoDetailFetch
Go
PRINT 'Creating stored procedure SchedulerSirasColcoDetailFetch'
Go

CREATE PROCEDURE [dbo].[SchedulerSirasColcoDetailFetch]
AS
BEGIN


 SELECT Colco_Code AS 'CountryCode',Connection_String AS 'Url',Resend_Interval AS 'ResendInterval',
   Default_Encoding AS 'Encoding' FROM dbo.SirasColcoDetail
END

Wenn ich die select-Anweisung innerhalb gespeicherte Prozedur als mein Kommando Text und stellen Sie die command als Text kopieren, alles funktioniert gut.

Könnten Sie bitte lassen Sie mich wissen, was das Problem ist ????

Vielen Dank im Voraus.

Mahesh

War es hilfreich?

Lösung

Sie sollen die Werte des SqlNotificationEventArgs Argument überprüfen. Nur wenn Typ ändern und Quelle Daten wo sie eine Datenänderung in Kenntnis gesetzt.

Sie werden feststellen, dass Sie nicht für die Datenänderungen informiert, sondern auch für falsche Einstellungen oder falsche Abfrage. Ihre Anfrage und Verbindungseinstellungen müssen den Anforderungen spezifiziert in einer Abfrage für Benachrichtigungen erstellen .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top