SQL缓存依赖项不使用存储过程

时间:2010-02-22 22:51:23

标签: asp.net sql sql-server sqlcachedependency

我无法让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合作吗? 谢谢!

5 个答案:

答案 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 查询参数值发生更改,则会使缓存失效,我认为这是有道理的。