1

几个小时后,我终于意识到我可以在我的 ASP.NET 应用程序中正确使用 Cache 对象,但是我的存储过程阻止它正常工作。

此存储过程正常工作:

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 生成的列 Row 只是暂时的事实有关,因此 SQL SERVER 无法说出结果是否更改。这就是 HasChanged 始终设置为 true 的原因。

有谁知道如何在不使用 COUNT 或 ROW_NUMBER 函数的情况下对 SQL SERVER 的结果进行分页?

4

3 回答 3

1

没有足够的缓存大小。

于 2009-10-12T10:18:05.923 回答
1

.NET 3.5 的 Sql 缓存依赖项仅适用于简单查询。也许 .NET 4 会让我大吃一惊。

于 2010-04-23T23:15:44.060 回答
0

1 - 您可以复制和粘贴您实际用于缓存该存储过程结果的代码吗?2 - 您是否尝试过使用直接查询而不是执行字符串的存储过程?

是的 #2 意味着您不能动态更改查询的结构 :-) 但除非您在 #1 中计算自己的缓存标准,否则这是您通常必须遵守的缓存规则。没有缓存机制会从您那里解析来自 EXEC 的字符串。

在 sproc 中执行字符串会使该 sproc 在每次运行时总抛硬币,即使对于 SQL Server 本身也是如此。它还使您容易受到脚本注入攻击,因为您的查询在运行时仍然由字符串组成 - 这与在 C# 中组成整个字符串并将其传递给 sproc 以“只执行内部的任何内容”没有任何不同

于 2010-07-12T22:37:41.777 回答