Зависимость кэша SQL не работает с хранимой процедурой - PullRequest
0 голосов
/ 23 февраля 2010

Я не могу заставить SqlCacheDependency работать с простым хранимым процессом (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;

}

Кому-нибудь повезло с тем, чтобы заставить его работать с SP?Спасибо!

Ответы [ 6 ]

1 голос
/ 01 марта 2010

Я понял это, нужно установить параметры запроса, прежде чем создавать 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
0 голосов
/ 29 апреля 2015

Обратите внимание, что вы не можете использовать

с (NOLOCK)

в хранимой процедуре или зависимость останется постоянно недействительной. Насколько я могу судить, это не упоминается в документации, насколько я могу судить

Я понимаю, что оригинальный постер этого не делал, но любой, кто пришел сюда с проблемой, указанной в названии, мог это сделать, поэтому я подумал, что стоит упомянуть.

0 голосов
/ 08 марта 2012

Другая причина может быть в выражении SQL:

AND dbo.[PublishDate] <= GetDate()

SQLCacheDependency будет вести себя так, как если бы базовые данные изменились, даже если они не изменились, поскольку GetDate () является динамическим (в равной степени, если вы должны были передать DateTime.Now через @parameter).

Это было неочевидно для меня после переписывания моего прока, следуя всем хорошим советам, приведенным выше, также не забывая также удалить «SET NOCOUNT ON» из прока. SQLCacheDependency истекает кэш при изменении данных ИЛИ изменяются значения параметров запроса, что, я полагаю, имеет смысл.

0 голосов
/ 01 декабря 2010

Кэширование SQL не будет работать, если вы используете select *, также вам нужно убедиться, что вы поставили dbo (или соответствующую схему) перед именем таблицы. Вы также можете проверить профилировщик SQL, чтобы убедиться, что ваш sql запущен, надеюсь, он вам поможет и т.д. ....

0 голосов
/ 24 сентября 2010

Для меня использование чего-то подобного в хранимой процедуре не сработало.

select id, name from dbo.tblTable;

Я должен был явно указать ссылки следующим образом.

select dbo.tblTable.id, dbo.tblTable.name from dbo.tblTable;
0 голосов
/ 23 февраля 2010

Вы не возвращаете данные из кэша каждый раз. Должно быть так:

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