我无法让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合作吗? 谢谢!
答案 0 :(得分: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
答案 1 :(得分:0)
每次都不会从缓存中返回数据。它应该是这样的:
if (Cache["Albums"]!=null)
{
return (DataTable) Cache["Albums"];
}
else
{
// you need to write coding from database.
}
答案 2 :(得分:0)
对于我在存储过程中使用这样的东西不起作用。
select id, name from dbo.tblTable;
我必须明确地输入这样的引用。
select dbo.tblTable.id, dbo.tblTable.name from dbo.tblTable;
答案 3 :(得分:0)
如果使用select *
,SQL缓存将无效,您还需要确保将dbo
(或相关架构)放在表名前面。
您还可以检查SQL事件探查器以验证您的sql
是否已运行希望对您有帮助等等....
答案 4 :(得分:0)
另一个原因可能是在SQL语句中:
AND dbo.[PublishDate] <= GetDate()
SQLCacheDependency 的行为就好像基础数据已经改变,即使它没有改变,因为GetDate()是动态的(同样如果您通过@parameter传递DateTime.Now)。
在按照上面的所有好建议重写我的过程之后,这对我来说并不明显,也不会忘记从过程中删除“SET NOCOUNT ON”。 SQLCacheDependency 如果数据更改 OR 查询参数值发生更改,则会使缓存失效,我认为这是有道理的。