سؤال

لدي تطبيق وحدة تحكم أقوم به في SQLDependency. مشكلتي هي عندما أقوم بتعيين CommandType كنص ، فهو يعمل بشكل جيد. ولكن إذا استخدمت CommandType كـ storedprocedure ، فإن طريقة OnChange تدعو بلا حدود.

الرجاء مراجعة التعليمات البرمجية أدناه:



        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();
        }

الإجراء المخزن الخاص بي هو:



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

إذا قمت بنسخ عبارة SELECT داخل الإجراء المخزّن كنص الأوامر الخاص بي وقم بتعيين CommandType كنص ، فكل شيء يعمل بشكل جيد.

هل يمكن أن تخبرني ما هي المشكلة ؟؟؟؟

شكرا جزيلا مقدما.

ماهيش

هل كانت مفيدة؟

المحلول

من المفترض أن تتحقق من قيم وسيطة sqlnotificationeventargs. فقط اذا يكتب هو يتغيرون و مصدر هو البيانات حيث تم إخطارك بتغيير البيانات.

سوف تكتشف أنه لم يتم إخطارك بتغييرات البيانات ، ولكن للإعدادات غير الصحيحة أو الاستعلام غير الصحيح. يجب أن تمتثل إعدادات الاستعلام والاتصال الخاصة بك للمتطلبات المحددة في إنشاء استعلام للإشعارات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top