سؤال

لا يمكنني الحصول على sqlcachedependency للعمل مع Proc Simple Scared (SQL Server 2008):

create proc dbo.spGetPeteTest
as

set  ANSI_NULLS ON
set ANSI_PADDING ON
set ANSI_WARNINGS ON
set CONCAT_NULL_YIELDS_NULL ON
set QUOTED_IDENTIFIER ON
set NUMERIC_ROUNDABORT OFF
set ARITHABORT ON

select Id, Artist, Album
from dbo.PeteTest

وهنا هو رمز ASP.NET الخاص بي (3.5 إطار):

-- global.asax
    protected void Application_Start(object sender, EventArgs e)
{
    string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString;
    System.Data.SqlClient.SqlDependency.Start(connectionString);
}

 -- Code-Behind
private DataTable GetAlbums()
{
    string connectionString =
    System.Configuration.ConfigurationManager.ConnectionStrings["UnigoConnection"].ConnectionString;

    DataTable dtAlbums = new DataTable();

    using (SqlConnection connection =
        new SqlConnection(connectionString))
    {
    // Works using select statement, but NOT SP with same text
    //SqlCommand command = new SqlCommand(
    //    "select Id, Artist, Album from dbo.PeteTest", connection);
    SqlCommand command = new SqlCommand();
    command.Connection = connection;
    command.CommandType = CommandType.StoredProcedure;
    command.CommandText = "dbo.spGetPeteTest";


    System.Web.Caching.SqlCacheDependency new_dependency =
        new System.Web.Caching.SqlCacheDependency(command);


    SqlDataAdapter DA1 = new SqlDataAdapter();
    DA1.SelectCommand = command;

    DataSet DS1 = new DataSet();

    DA1.Fill(DS1);

    dtAlbums = DS1.Tables[0];

    Cache.Insert("Albums", dtAlbums, new_dependency);
    }

    return dtAlbums;

}

أي شخص لديه أي حظ في الحصول على هذا العمل مع SPS؟ شكرًا!

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

المحلول

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

USE [MyDatabase]
GO

set ANSI_NULLS ON
set ANSI_PADDING ON
set ANSI_WARNINGS ON
set CONCAT_NULL_YIELDS_NULL ON
set QUOTED_IDENTIFIER ON
set NUMERIC_ROUNDABORT OFF
set ARITHABORT ON
go


create proc [dbo].[spGetPeteTest]
as

select Id, Artist, Album
from dbo.PeteTest

GO

نصائح أخرى

أنت لا تقوم بإرجاع البيانات من ذاكرة التخزين المؤقت في كل مرة. يجب أن يكون هكذا:

if (Cache["Albums"]!=null)
{
   return (DataTable) Cache["Albums"];
}
else
{
  // you need to write coding from database.
}

سبب آخر يمكن أن يكون هذا في بيان SQL:

AND dbo.[PublishDate] <= GetDate()

ال sqlcachedependency سوف تتصرف كما لو أن البيانات الأساسية قد تغيرت حتى لو لم تكن كذلك ، لأن getDate () كان ديناميكيًا (على قدم المساواة إذا كنت تريد أن تمر DateTime. الآن عبر parameter).

لم يكن هذا واضحًا بالنسبة لي بعد إعادة كتابة Proc بعد جميع الاقتراحات الجيدة أعلاه ، وأيضًا لا تنسى أيضًا إزالة "Set nocount On" من Proc. sqlcachedependency تنتهي ذاكرة التخزين المؤقت إذا تغيرت البيانات أو تتغير قيم معلمات الاستعلام ، مما يجعلني أفترض.

بالنسبة لي باستخدام شيء مثل هذا في بروك المخزنة لم يعمل.

select id, name from dbo.tblTable;

اضطررت إلى وضع المراجع بشكل صريح.

select dbo.tblTable.id, dbo.tblTable.name from dbo.tblTable;

لن يعمل التخزين المؤقت SQL إذا كنت تستخدم select *, ، تحتاج أيضًا إلى التأكد من وضعك dbo (أو المخطط ذي الصلة) أمام اسم الجدول الخاص بك. يمكنك أيضًا التحقق من SQL Profiler للتحقق مما إذا sql هل يدير الأمل سيساعدك وما إلى ذلك ....

لاحظ أنه لا يمكنك استخدام

مع (نولوك)

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

أدرك أن الملصق الأصلي لم يفعل هذا ، لكن أي شخص قادم إلى هنا لديه المشكلة المذكورة في العنوان ربما يكون قد فعل ذلك ، لذلك اعتقدت أن الأمر يستحق الذكر.

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