多小时后,我终于明白,我用正确的Cache对象在我的ASP.NET应用程序的工作,但我的存储过程会让其停止正常工作。

这个存储过程正常工作:

CREATE PROCEDURE [dbo].[ListLanguages]
@Page INT = 1,
@ItemsPerPage INT = 10,
@OrderBy NVARCHAR (100) = 'ID',
@OrderDirection NVARCHAR(4) = 'DESC'
AS
BEGIN
    SELECT ID, [Name], Flag, IsDefault FROM dbo.Languages
END

但是,这(我想要的一个)不

CREATE PROCEDURE [dbo].[ListLanguages]
@Page INT = 1,
@ItemsPerPage INT = 10,
@OrderBy NVARCHAR (100) = 'ID',
@OrderDirection NVARCHAR(4) = 'DESC',
@TotalRecords INT OUTPUT
AS
BEGIN
    SET @TotalRecords = 10

EXEC('SELECT ID, Name, Flag, IsDefault FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY ' + @OrderBy + ' ' + @OrderDirection + ') as Row, ID, Name, Flag, IsDefault
    FROM dbo.Languages) results
    WHERE Row BETWEEN ((' + @Page + '-1)*' + @ItemsPerPage + '+1) AND (' + @Page + '*' + @ItemsPerPage + ')')
END

我给@TotalRecords参数的值10,所以你可以肯定的是,问题不是从我知道是不是可以很好地支持了COUNT(*)函数。

此外,当我从SQL Server Management Studio中运行它,它不正是它应该做的。在ASP.NET应用程序的结果都正确检索,只缓存在某种程度上无法工作!

您可以请帮助?

也许一个提示

我认为,之所以依赖HasChanged物业的理由是有关的事实,从ROW_NUMBER产生的列行只是暂时的,因此,在SQL SERVER不能说结果是否改变与否。这就是为什么HasChanged始终设置为true。

有谁知道如何从分页SQL SERVER的结果,而使用COUNT或ROW_NUMBER功能?

有帮助吗?

解决方案 2

有关.NET 3.5 SQL缓存依赖只适用于简单的查询。也许.NET 4将让我感到惊讶。

其他提示

不够高速缓存大小。

1 - 你能复制和粘贴你实际使用来缓存存储过程的结果的代码? 2 - 你试过,你用直的查询,而不是EXEC-ING字符串一个存储过程

是#2意味着你不能改变查询的结构上飞:-)但除非你在#1计算你自己的缓存标准的的缓存你一般要遵守的规则。没有缓存机制曾经打算从你解析从EXEC字符串。

EXEC-ING在一个存储过程的字符串使得该存储过程对每一个硬币的总运行抛甚至对于SQL Server本身。它也让你打开脚本注入攻击,因为你的查询仍然在被串在运行时组成的 - 它不是从构成C#中的整个字符串并将其传递任何不同,以存储过程“只是EXEC无论是里面的”

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top