غير قادر على إبطال ذاكرة التخزين المؤقت التي تعتمد على استعلام SQL

StackOverflow https://stackoverflow.com/questions/4334562

سؤال

أحاول إبطال ذاكرة التخزين المؤقت بناءً على التغيير في صفوف قاعدة البيانات. لقد حققت النجاح أثناء القيام بنفس الشيء مع LINQ مع نفس قاعدة البيانات والجدول ولكن لا أستطيع القيام بذلك بالطريقة الأساسية:

هنا هو الرمز الذي كتبته ، الرجاء المساعدة:

public DataSet GetData(string sqlCmd)
    {
        string connectionStr = System.Configuration.ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString;
        string cacheKey = "test123";
        DataSet ds = (DataSet)HttpRuntime.Cache.Get(cacheKey);
        if (ds != null)
        {
            return ds;
        }
        SqlCacheDependency sqldep = null;
        SqlConnection conn = new SqlConnection(connectionStr);
        SqlCommand cmd = new SqlCommand(sqlCmd, conn);
        cmd.Notification = null;
        cmd.NotificationAutoEnlist = true;
        SqlDataAdapter sqlAd = new SqlDataAdapter(cmd);
        ds = new DataSet();
        sqlAd.Fill(ds);

        System.Web.Caching.SqlCacheDependencyAdmin.EnableNotifications(connectionStr);
        string NotificationTable = "TblMetaData";
        if (!System.Web.Caching.SqlCacheDependencyAdmin.GetTablesEnabledForNotifications(connectionStr).Contains(NotificationTable))
            System.Web.Caching.SqlCacheDependencyAdmin.EnableTableForNotifications(connectionStr, NotificationTable);
        sqldep = new SqlCacheDependency(cmd);

        HttpRuntime.Cache.Insert(cacheKey, ds, sqldep);
        return ds;

    }

أنا أستخدم SQL Server 2005 واستخدام الاستعلامات المؤهلة بالكامل التي يمكن أن تعمل مع إشعار الأوامر.

يعمل الكود الآخر في LINQ تمامًا مع نفس قاعدة البيانات والجدول ، لذلك لا يوجد أي جدوى من وسيط الخدمة أو الأذونات الأخرى التي لم يتم تعيينها. الرجاء مساعدتي في التخلص من هذه المشكلة.

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

المحلول

تحتوي هذه المقالة على بعض خطوات استكشاف الأخطاء وإصلاحها الإخطار الغامض, ، إلى جانب شرح كيف تعمل الأشياء التي تساعد على محاولة فهم سبب كسر شيء ما. يجب عليك التحقق من صحة أن كل قطعة من الآلية تعمل:

  • تحقق من إنشاء إشعار الاشتراك في sys.dm_qn_subscriptions
  • تحقق من أن الإشعار يحصل مطرود
  • تحقق من أن الإشعار يحصل تم التوصيل (يمكنك تجاهل كل شيء بأمان حول التوجيه والتسليم عن بُعد في هذا الرابط ، لأن SQLDPendency محلي دائمًا)

في ملاحظة غير ذات صلة ، يمكنك استخدام إشعارات LINQ-to-SQL والاستعلام مباشرة: linqtocache.

نصائح أخرى

أفضل ما يجب فعله هو: ألقِ نظرة على سجل SQL ، إذا حدثت أي مشكلة في الإشعارات ، فسيظهر LOG!

يوجد سجل الخطأ في ملفات البرنامج Microsoft SQL Server mssql.n mssql log errorlog و errorlog.n

في حالتي ، حدثت المشكلة بسبب استعادة قاعدة البيانات ، لحلها ، أظهر لي السجل المشكلة ، ثم أقوم بتنفيذ

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