Domanda

Bisogna tornare sottoinsieme di record e per questo usiamo il seguente comando:

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

Ho impostato uno SqlCacheDependency dichiarato in questo modo:

SqlCacheDependency cacheDependency = new SqlCacheDependency(command);

Ma subito dopo ho eseguito le istruzioni Command.ExecuteReader (), il hasChanged proprietà base dell'oggetto SqlCacheDependency diventa vero anche se non ho cambiato il risultato della query in alcun modo! E, a causa di questo, il risultato di questa query non viene tenuto in cache.

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

E 'perché il comando ha 2 istruzioni SELECT? È ROW_NUMBER ()? Se sì, c'è qualche altro modo per impaginare i risultati?

Si prega di aiutare! Dopo troppe ore, un po 'sarà molto apprezzato! Grazie

È stato utile?

Soluzione

L'esecuzione nello stesso problema e di trovare le stesse risposte on-line senza alcun aiuto, ero reasearching xml risposta subsicription non valida dal profiler.

Ho trovato un esempio sul sito di supporto di MSDN che ha avuto un ordine leggermente diverso di codice. Quando ho provato ho capito il problema - Non aprire l'oggetto di connessione fino a dopo aver creato l'oggetto di comando e l'oggetto della cache dipendenza. Ecco l'ordine è necessario seguire e tutto andrà bene:

  1. Assicurati di attivare le notifiche (SqlCahceDependencyAdmin) ed eseguire SqlDependency.Start prima
  2. Crea l'oggetto di connessione
  3. Creare l'oggetto comando e assegnare testo di comando, il tipo e oggetto di connessione (qualsiasi combinazione di costruttori, impostazione delle proprietà, o utilizzando CreateCommand).
  4. Crea l'oggetto della cache SQL dipendenza
  5. Aprire l'oggetto di connessione
  6. Eseguire la query
  7. Aggiungi elemento di memorizzare nella cache utilizzando la dipendenza.

Se si segue questo ordine, e seguire tutti gli altri requisiti sulla vostra dichiarazione prescelta, non hanno alcun problemi di autorizzazioni, questo funzionerà!

Credo che la questione ha a che fare con il modo in .NET framework gestisce la connessione, in particolare quello che le impostazioni sono impostate. Ho provato l'override questo nel mio test comando SQL, ma non ha mai funzionato. Questa è solo una supposizione -. Quello che so sta cambiando l'ordine immediatamente risolto il problema

Sono stato in grado di mettere insieme una delle seguenti opzioni per i messaggi MSDN.

Questo messaggio è stato una delle cause più comuni di sottoscrizione non valida, e mostra come il client .NET imposta le proprietà che sono in contrasto con quello che richiede la notifica.

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

Quindi questo post è stato da un utente che, come me, aveva ridotto il suo codice per il formato più semplice. Il mio modello codice originale era simile al suo.

https://social.technet.microsoft.com/Forums/windows/en-US/5a29d49b-8c2c-4fe8-b8de-d632a3f60f68/subscriptions-always-invalid- soliti sospette-controllato-no-gioia? forum = sqlservicebroker

Poi ho trovato questo post, anche una semplice riduzione del problema, solo il suo era un semplice problema - che necessitano di nome 2 parte per le tabelle. Nel suo caso il suggerimento ha risolto il problema. Dopo aver guardato il suo codice ho notato la differenza principale era in attesa di aprire l'oggetto di connessione fino a dopo che l'oggetto di comando e l'oggetto di dipendenza sono stati creati. Il mio unico presupposto è sotto il cofano (non ho ancora iniziato riflettore per controllare in modo che solo una supposizione) l'oggetto Connection è aperto in modo diverso, o l'ordine di eventi e di comando avvenga in modo diverso, a causa di questa associazione.

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/bc9ca094-a989-4403-82c6- 7f608ed462ce / sql-server-non-creare-abbonamento-for-semplici-select-query-quando-con-SqlCacheDependency? forum = sqlservicebroker

Spero che questo aiuta a qualcun altro in un problema simile.

Altri suggerimenti

Solo una supposizione, ma potrebbe essere perché la sua dichiarazione SELECT non ha una clausola ORDER BY?

Se non si specifica un ordinamento esplicito, allora è possibile che la query per restituire i risultati in qualsiasi ordine ogni volta che viene eseguito. Forse questo sta causando l'oggetto SqlCacheDependency a pensare che i risultati sono cambiati.

Prova ad aggiungere una clausola 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

Non sono un esperto in SqlCacheDependency, infatti, ho trovato mentre cerca di risposte ai miei problemi con esso a questa domanda! Tuttavia, credo che il motivo per il vostro SqlCacheDependency non funziona è perché il vostro SQL contiene una query sub nidificato.

Date un'occhiata alla documentazione che elenca ciò che si può / non è possibile utilizzare nel vostro SQL: Creazione di una query per la notifica

".... La dichiarazione non deve contenere subquery, outer join, o auto-join ....."

Ho trovato anche alcune informazioni sulla risoluzione dei problemi prezioso da un ragazzo al Redgate qui: utilizzo e monitoraggio SQL 2005 notifica Query che mi ha aiutato a risolvere il mio problema: utilizzando SQL Profiler per tracciare gli eventi QN suggerisce, sono stato in grado di individuare la mia connessione è stata correttamente utilizzando l'opzione 'SET ARITHABORT OFF', provocando le notifiche al sicuro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top