2010-02-22 2 views
0

Я не могу SqlCacheDependency работать с простым ХПОМ (SQL Server 2008):SQL Зависимости кэш не работает с хранимой процедурой

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? Спасибо!

ответ

1

Я понял это, нужно установить параметры запроса ПЕРЕД тем, как создавать 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

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

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

Да, я звоню следующим образом: DataTable dtAlbums = (DataTable) Cache.Get ("Albums"); if (dtAlbums == null) { dtAlbums = GetAlbums(); } GridView1.DataSource = dtAlbums.Вид по умолчанию; GridView1.DataBind(); И метод GetAlbums() работает, если я использую команду select, например. выберите id, artist, album из PeteTest. Но когда один и тот же оператор выбора завернут в SP, кеширование не работает. – pjacko

0

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

select id, name from dbo.tblTable; 

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

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

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

0

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

AND dbo.[PublishDate] <= GetDate() 

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

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

0

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

с (NOLOCK)

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

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