Question

Nous devons retourner sous-ensemble des dossiers et que nous utilisons la commande suivante:

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))

Je mis un SqlCacheDependency déclaré comme ceci:

SqlCacheDependency cacheDependency = new SqlCacheDependency(command);

Mais immédiatement après que je lance l'instruction Command.ExecuteReader (), hasChanged de base de l'objet SqlCacheDependency devient vrai, bien que je ne change pas le résultat de la requête en aucune façon! Et, à cause de cela, le résultat de cette requête ne sont pas conservées dans le cache.

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

Est-ce parce que la commande a 2 instructions SELECT? Est-ce ROW_NUMBER ()? Si oui, est-il une autre façon de paginera résultats?

S'il vous plaît aider! Après trop d'heures, un peu sera grandement appréciée! Merci

Était-ce utile?

La solution

L'exécution dans le même problème et trouver les mêmes réponses en ligne sans aucune aide, je reasearching la réponse subsicription invalide xml de profileur.

J'ai trouvé un exemple sur le site de support msdn qui avait un ordre légèrement différent du code. Quand je l'ai essayé, je pris conscience du problème - Ne pas ouvrir votre objet de connexion jusqu'à ce que vous avez créé l'objet de commande et l'objet de la dépendance de cache. Voici l'ordre que vous devez suivre et tout ira bien:

  1. Veillez à activer les notifications (SqlCahceDependencyAdmin) et exécutez SqlDependency.Start premier
  2. Créer l'objet de connexion
  3. Créer l'objet de commande et affecter du texte de commande, type et objet de connexion (toute combinaison des constructeurs, la définition des propriétés, ou en utilisant CreateCommand).
  4. Créer l'objet de dépendance de cache SQL
  5. Ouvrez l'objet de connexion
  6. Exécuter la requête
  7. Ajouter un élément à mettre en cache en utilisant la dépendance.

Si vous suivez cet ordre, et suivez toutes les autres exigences de votre instruction select, ne pas avoir de problèmes d'autorisations, cela fonctionne!

Je crois que la question a à voir avec la façon dont le .NET Framework gère la connexion, plus précisément quels paramètres sont définis. J'ai essayé dans mon remplaçant test de commande SQL, mais il n'a jamais travaillé. Ce n'est une supposition -. Ce que je ne sais change l'ordre résolu immédiatement la question

J'ai pu reconstituer ensemble des options suivantes à des postes msdn.

Ce message a été l'une des causes les plus courantes de l'abonnement non valide, et montre comment le client .Net définit les propriétés qui sont contrairement à ce que la notification a besoin.

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

Alors ce poste est d'un utilisateur qui, comme moi, avait réduit son code au format le plus simple. Mon modèle de code d'origine était semblable à la sienne.

https://social.technet.microsoft.com/Forums/windows/en-US/5a29d49b-8c2c-4fe8-b8de-d632a3f60f68/subscriptions-always-invalid- habituels-suspects véRIFIéE-no-joie? forum = sqlservicebroker

Alors j'ai trouvé ce post, aussi une réduction très simple du problème, que le sien était une question simple - 2 besoin nom partie pour les tables. Dans son cas, la suggestion a résolu le problème. Après avoir regardé son code, j'ai remarqué la différence principale attendait d'ouvrir l'objet de connexion qu'APRÈS l'objet de commande et l'objet de la dépendance ont été créés. Ma seule hypothèse est sous le capot (je ne l'ai pas encore commencé réflecteur pour vérifier qu'une hypothèse) l'objet de connexion est ouvert différemment, ou l'ordre des événements et des commandes se produire différemment, en raison de cette association.

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/bc9ca094-a989-4403-82c6- 7f608ed462ce / sql-server-not-création-abonnement pour-simple-select-requête en utilisant-SqlCacheDependency? forum = sqlservicebroker

J'espère que cela aide quelqu'un d'autre dans un problème similaire.

Autres conseils

Juste une supposition, mais pourrait-il être parce que votre déclaration de SELECT n'a pas une clause ORDER BY?

Si vous ne spécifiez pas un ordre explicite, alors il est possible pour la requête pour retourner les résultats dans un ordre chaque fois qu'il est exécuté. Peut-être cela est à l'origine l'objet SqlCacheDependency de penser que les résultats ont changé.

Essayez d'ajouter une clause ORDER BY:

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

Je ne suis pas un expert en SqlCacheDependency, en fait, je l'ai trouvé à cette question tout en cherchant des réponses à mes propres problèmes avec elle! Cependant, je crois que la raison pour laquelle votre SqlCacheDependency ne fonctionne pas parce que votre SQL contient une requête sous imbriquée.

Jetez un oeil à la documentation qui indique ce que vous pouvez / ne pouvez pas utiliser dans votre SQL: Création d'une requête de notification

".... La déclaration ne doit pas contenir des sous-requêtes, les jointures externes ou autojointures ....."

J'ai aussi trouvé quelques informations de dépannage précieux d'un gars à Redgate ici:

scroll top