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-そのsprocの結果をキャッシュするために実際に使用するコードをコピーして貼り付けることはできますか? 2 - 文字列を EXEC する代わりに直接クエリを使用する sproc を試しましたか?

はい#2は、その場でクエリの構造を変更できないことを意味します:-)しかし、#1で独自のキャッシュ基準を計算していない限り、それは一般的に従わなければならないキャッシュのルールです。EXEC からの文字列を解析するキャッシング メカニズムはありません。

sproc で文字列を EXEC すると、その sproc は、SQL Server 自体であっても、実行のたびにコインを 1 枚投げることになります。また、実行時にクエリがまだ文字列で構成されているため、スクリプト インジェクション攻撃を受けやすいままになります。これは、C# で文字列全体を構成し、それを sproc に渡して「内部にあるものは何でも実行する」のと同じです。

于 2010-07-12T22:37:41.777 に答える