Frage

Wir brauchen Teilmenge von Datensätzen zurückzukehren und für die wir den folgenden Befehl verwenden:

using (SqlCommand command = new SqlCommand(
                    "SELECT ID, Name, Flag, IsDefault FROM (SELECT ROW_NUMBER() OVER (ORDER BY @OrderBy DESC) as Row, ID, Name, Flag, IsDefault FROM dbo.Languages) results WHERE Row BETWEEN ((@Page - 1) * @ItemsPerPage + 1) AND (@Page * @ItemsPerPage)",
                    connection))

Ich habe ein SqlCacheDependency wie folgt erklärt:

SqlCacheDependency cacheDependency = new SqlCacheDependency(command);

Aber gleich nachdem ich die Command.ExecuteReader run () Anweisung, die haschanged Grundeigenschaft des SqlCacheDependency Objekts wird wahr, obwohl ich nicht das Ergebnis der Abfrage in irgendeiner Weise geändert habe! Und aus diesem Grunde wird das Ergebnis dieser Abfrage nicht im Cache gehalten werden.

HttpRuntime.Cache.Insert( cacheKey, list, cacheDependency, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(AppConfiguration.CacheExpiration.VeryLowActivity));

Ist es, weil der Befehl 2 SELECT-Anweisungen hat? Ist es ROW_NUMBER ()? Wenn ja, gibt es eine andere Art und Weise zu Paginieren Ergebnissen?

Bitte Hilfe! Nach vielen Stunden wird ein wenig sehr zu schätzen! Danke

War es hilfreich?

Lösung

Beim Laufen in das gleiche Problem und das Finden die gleichen Antworten online ohne jede Hilfe, ich war Reasearching die XML ungültig subsicription Antwort von Profiler.

fand ich ein Beispiel auf Msdn Support-Site, die eine etwas andere Reihenfolge der Code hatte. Als ich es versuchte, wurde mir klar, das Problem - öffnen Sie das Verbindungsobjekt erst, nachdem Sie den Befehl Objekt erstellt haben und das Cache-Abhängigkeitsobjekt. Hier ist die Reihenfolge, die Sie folgen müssen, und alles wird gut:

  1. Seien Sie sicher, dass Benachrichtigungen aktivieren (SqlCahceDependencyAdmin) und führen SqlDependency.Start erste
  2. Erstellen Sie das Verbindungsobjekt
  3. Erstellen der Befehlsobjekt und assign Befehlstext, den Typ und Verbindungsobjekt (eine beliebige Kombination von Konstrukteuren, Eigenschaften festlegen, oder mit Create).
  4. Erstellen Sie die SQL-Cache Abhängigkeitsobjekt
  5. Öffnen Sie das Verbindungsobjekt
  6. Führen Sie die Abfrage
  7. Artikel in der Cacheabhängigkeit verwendet wird.

Wenn Sie diesen Auftrag folgen, und befolgen Sie alle weiteren Anforderungen auf dem select-Anweisung, haben keine Probleme mit Berechtigungen, dies funktionieren wird!

Ich glaube, die Frage zu tun hat mit, wie der .NET-Framework verwaltet die Verbindung, speziell welche Einstellungen festgelegt werden. Ich habe versucht, dies in meinem SQL-Befehl Test überschreiben, aber es funktionierte nie. Dies ist nur eine Vermutung -., Was ich weiß, ist eine Änderung der Reihenfolge sofort das Problem gelöst

Ich konnte es Stück zusammen aus den folgenden Msdn Beiträge.

Dieser Beitrag war eine der häufigsten Ursachen für den ungültigen Abonnement, und zeigt, wie die .NET-Client stellt die Eigenschaften, die im Gegensatz zu dem, was Meldung erfordert.

https://social.msdn.microsoft.com/Forums/en-US/cf3853f3-0ea1-41b9-987e-9922e5766066/changing-default-set-options-forced-by- net? forum = adodotnetdataproviders

Dann wurde dieser Beitrag von einem Benutzer, der, wie ich, seinen Code auf das einfachstene Format reduziert hatte. Mein ursprüngliches Codemuster war ähnlich sein.

https://social.technet.microsoft.com/Forums/windows/en-US/5a29d49b-8c2c-4fe8-b8de-d632a3f60f68/subscriptions-always-invalid- üblich Verdächtigen-geprüft-no-Freude? forum = sqlservicebroker

Dann fand ich diesen Beitrag, auch eine sehr einfache Reduktion des Problems, nur war seine einfache Frage - um 2 Teilnamen für Tabellen. In seinem Fall beschloss der Vorschlag das Problem. Nachdem in seinem Code suchen bemerkte ich, der Hauptunterschied, bis das Verbindungsobjekt zu öffnen, wartet nach dem Befehl Objekt und das Abhängigkeitsobjekt erstellt wurde. Meine einzige Voraussetzung ist unter der Haube (ich habe noch nicht begonnen Reflektor so nur eine Annahme zu überprüfen) das Connection-Objekt geöffnet werden anders, oder die Reihenfolge der Ereignisse und Befehls geschehen anders, denn diese Vereinigung.

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/bc9ca094-a989-4403-82c6- 7f608ed462ce / sQL-Server-nicht-Erstellung-Abonnement-for-simple-select-Abfrage-when-using-SqlCacheDependency? forum = sqlservicebroker

Ich hoffe, das jemand anderes in einem ähnlichen Problem hilft.

Andere Tipps

Nur eine Vermutung, aber es könnte sein, weil Ihre SELECT Aussage keine ORDER BY Klausel?

Wenn Sie keine explizite Bestellung angeben dann möglich, es ist für die Abfrage der Ergebnisse in beliebiger Reihenfolge jedes Mal zurück es ausgeführt wird. Vielleicht ist das was die SqlCacheDependency Objekt zu denken, dass die Ergebnisse geändert haben.

Versuchen Sie, eine ORDER BY Klausel hinzufügen:

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

Ich bin kein Experte auf SqlCacheDependency, in der Tat, ich diese Frage gefunden, während der Suche nach Antworten auf meine eigenen Probleme mit ihm! Aber ich glaube, der Grund, warum Ihr SqlCacheDependency nicht funktioniert, weil Ihr SQL eine verschachtelte Unterabfrage enthält.

Werfen Sie einen Blick in die Dokumentation, welche Listen, was Sie können / nicht in Ihrer SQL verwenden können: eine Abfrage für die Benachrichtigung Erstellen

".... Die Anweisung darf keine Unterabfragen enthalten, Outer-Joins oder selbst verbindet ....."

Ich fand auch einige wertvolle Informationen zur Fehlerbehebung von einem Mann bei Redgate hier:

scroll top