[英]SQL Cache Dependency not working with Stored Procedure
我无法使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一起使用吗? 谢谢!
我想通了这一点,需要在创建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.
}
请注意,您不能使用
与(NOLOCK)
存储过程中的依赖项将始终保持无效。 据我所知,这似乎没有在文档中提及
我意识到原始的发帖人没有这样做,但是来这里遇到标题中所述问题的任何人都可以这样做,所以我认为值得一提。
对我来说,在存储过程中使用类似这样的东西是行不通的。
select id, name from dbo.tblTable;
我必须像这样显式地放入引用。
select dbo.tblTable.id, dbo.tblTable.name from dbo.tblTable;
如果使用select *
,则SQL缓存将不起作用,并且还需要确保将dbo
(或相关架构)放在表名的前面。 您还可以检查SQL事件探查器以验证您的sql
是否运行,希望对您有所帮助...。
另一个原因可能是在SQL语句中出现的:
AND dbo.[PublishDate] <= GetDate()
由于GetDate()是动态的(如果要通过@parameter传递DateTime.Now,则是动态的), SQLCacheDependency的行为就好像基础数据即使没有更改一样。
在按照上面所有好的建议重新编写proc之后,这对我来说并不明显,也不要忘记从proc中删除“ SET NOCOUNT ON”。 如果数据更改或查询参数值更改, SQLCacheDependency将使缓存过期,我想这是有道理的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.