Question

Après plusieurs heures, je me rends compte enfin que je travaille correctement avec l'objet du cache dans mon application ASP.NET, mais mes procédures stockées, il arrête de fonctionner correctement.

Cette procédure stockée fonctionne correctement:

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

Mais ce (celui que je voulais) ne fait pas:

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

J'ai donné le @TotalRecords paramètre la valeur 10 de sorte que vous pouvez être sûr que le problème ne provient pas de la fonction COUNT (*) que je connais ne sont pas pris en charge bien.

En outre, quand je le lance à partir de SQL Server Management Studio, il fait exactement ce qu'il doit faire. Dans l'application ASP.NET les résultats sont récupérés correctement, seul le cache est en quelque sorte incapable de travailler!

Pouvez-vous s'il vous plaît aider?

Peut-être un indice

Je crois que la raison pour laquelle la dépendance hasChanged propriété est liée au fait que la ligne de colonne générée à partir du ROW_NUMBER est temporaire et, par conséquent, le serveur SQL ne peut pas dire si les résultats sont modifiés ou non. Voilà pourquoi hasChanged est toujours définie sur true.

Quelqu'un sait comment paginate résultats de SQL Server sans utiliser les fonctions COUNT ou ROW_NUMBER?

Était-ce utile?

La solution 2

Sql la dépendance de cache pour .NET 3.5 ne fonctionne que pour les requêtes simples. Peut-être que .NET 4 me surprendre.

Autres conseils

pas assez taille du cache.

1 - Pouvez-vous copier et coller le code que vous utilisez réellement pour mettre en cache les résultats de cette sproc? 2 - Avez-vous essayé un sproc où vous utilisez requête directement au lieu d'EXEC-ing une chaîne

?

Oui # 2 signifie que vous ne pouvez pas changer la structure de la requête sur le :-) mouche mais à moins que vous calculez vos propres critères de mise en cache dans # 1 qui est la règle de la mise en cache, vous devez respecter en général. Aucun mécanisme de mise en cache est toujours va analyser une chaîne de EXEC de vous.

EXEC-ing une chaîne dans un sproc fait que sproc un tirage total d'une pièce de monnaie sur chaque être exécuté même pour SQL Server lui-même. Il laisse également d'ouvrir aux attaques par injection de script depuis votre requête est toujours composée par les chaînes au moment de l'exécution - ce n'est pas différent de composer la chaîne entière en C # et en passant à SProc à « juste EXEC tout ce qui est à l'intérieur »

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top