Зависимость кэша SQL, не работающая с Хранимой процедурой

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

Вопрос

Я не могу заставить 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;

}

Кому-нибудь удалось заставить это работать с 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.Теперь через параметр @).

Это было не очевидно для меня после переписывания моей процедуры, следуя всем хорошим предложениям выше, также не забыв также удалить "SET NOCOUNT ON" из процедуры. Зависимость от SqlCacheDependency срок действия кэша истекает, если данные изменяются или значения параметров запроса меняются, что, я полагаю, имеет смысл.

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

select id, name from dbo.tblTable;

Мне пришлось явно указать такие ссылки.

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

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

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

с (НОЛОК)

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top