Frage

Nach vielen Stunden habe ich endlich erkennen, dass ich mich richtig in meine ASP.NET-Anwendung mit dem Cache-Objekt arbeite aber meine gespeicherten Prozeduren hält es ordnungsgemäß funktioniert.

Diese gespeicherte Prozedur ordnungsgemäß funktioniert:

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

Aber das (die, die ich wollte) nicht:

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

gab ich die @TotalRecords Parameter den Wert 10, so dass Sie sicher sein können, dass das Problem nicht aus der COUNT (*) Funktion ist, die ich kenne, ist nicht gut unterstützt.

Auch wenn ich es von SQL Server Management Studio ausführen, ist es genau das tut, was es tun soll. In der ASP.NET-Anwendung werden die Ergebnisse korrekt abgerufen, nur die Cache Arbeit irgendwie nicht in der Lage ist!

Können Sie bitte helfen?

Vielleicht ein Hinweis

Ich glaube, dass der Grund, warum die Abhängigkeitseigenschaft Haschanged Zusammenhang mit der Tatsache, dass die Spalt Row aus dem ROW_NUMBER erzeugte nur vorübergehend ist, und daher ist der SQL-Server zu sagen, nicht in der Lage, ob die Ergebnisse geändert werden oder nicht. Deshalb Haschanged immer auf true gesetzt ist.

Wer weiß, wie Ergebnisse von SQL Server Paginieren, ohne Funktionen COUNT oder ROW_NUMBER?

War es hilfreich?

Lösung 2

SQL-Cache-Abhängigkeit für .NET 3.5 funktioniert nur für einfache Abfragen. .NET 4 überrascht mich vielleicht.

Andere Tipps

nicht genügend Cache-Größe.

1 - Können Sie kopiere den Code, den Sie tatsächlich nutzen die Ergebnisse dieser sproc zwischenzuspeichern? 2 - Haben Sie versucht, eine sproc, wo Sie gerade Abfrage verwenden statt EXEC-ing eine Zeichenfolge

?

Ja # 2 bedeutet, dass Sie nicht die Struktur der Abfrage im laufenden Betrieb ändern können :-), aber wenn Sie Ihre eigenen Caching-Kriterien in # 1 werden die Berechnung, die ist die Regel von Cachen Sie im allgemeinen zu halten haben. Kein Caching-Mechanismus wird immer einen String aus EXEC von Ihnen zu analysieren gehen.

EXEC-ing eine Zeichenfolge in einem sproc macht, dass sproc insgesamt eine Münze wirft auf jedem und jeden Lauf auch für SQL Server selbst. Es lässt Sie auch öffnen, um Skript-Injection-Angriffe, da Ihre Anfrage noch von Strings zur Laufzeit zusammengesetzt ist - es ist nicht anders von den ganzen String in C # zu komponieren und zu sproc zu passing „nur EXEC, was innen ist“

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top