Pregunta

Necesitamos volver subconjunto de registros y para ello utilizamos el siguiente 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))

Me puse un SqlCacheDependency declarado como este:

SqlCacheDependency cacheDependency = new SqlCacheDependency(command);

Pero inmediatamente después de ejecutar el comando.ExecuteReader() instrucción, el hasChanged la base de la propiedad de la SqlCacheDependency objeto se convierte en cierto aunque yo no cambio el resultado de la consulta de cualquier manera!Y, debido a esto, el resultado de esta consulta no es guardada en la memoria caché.

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

Es porque el comando tiene 2 SELECCIONE declaraciones?Es ROW_NUMBER()?Si sí, ¿hay alguna otra manera para paginar los resultados?

Por favor, ayuda!Después de muchas horas, un poco será muy apreciada!Gracias

¿Fue útil?

Solución

Se ejecuta en el mismo problema y encontrar las respuestas en línea sin ningún tipo de ayuda, yo estaba reasearching el xml no válido subsicription respuesta del analizador.

He encontrado un ejemplo en msdn sitio de soporte que tiene un poco de orden diferente de código.Cuando lo probé me di cuenta de que el problema - no abra el objeto de conexión hasta después de haber creado el objeto de comando y la dependencia de caché de objeto.Aquí es el orden que debe seguir y todo va a ser bueno:

  1. Asegúrese de activar las notificaciones (SqlCahceDependencyAdmin) y ejecutar SqlDependency.Inicio de la primera
  2. Crear el objeto de conexión
  3. Crear el objeto de comando y asignar comandos de texto, el tipo y el objeto de conexión (cualquier combinación de los constructores, la configuración de propiedades, o el uso de CreateCommand).
  4. Crear la dependencia de caché de sql objeto
  5. Abra el objeto de conexión
  6. Ejecutar la consulta
  7. Añadir elemento a almacenar en caché utilizando dependencia.

Si usted sigue este orden, y seguir con todos los demás requisitos de la instrucción select, no tienen problemas de permisos, esto va a funcionar!

Yo creo que el tema tiene que ver con la forma de la .NET framework gestiona la conexión, específicamente lo que se establece la configuración.He intentado reemplazando esta en mi comando sql de probar, pero nunca funcionó.Esta es sólo una conjetura - lo que sí sé es cambiar el orden de inmediato resuelto el problema.

Yo era capaz de reconstruirla desde el siguiente a msdn puestos.

Este post fue una de las causas más comunes de la suscripción válido, y muestra cómo el .Cliente de red establece las propiedades que están en contraste con lo que la notificación requiere.

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

A continuación, en este post de un usuario que, como yo, habían reducido su código para el formato más simple.Mi código original patrón fue similar a la suya.

https://social.technet.microsoft.com/Forums/windows/en-US/5a29d49b-8c2c-4fe8-b8de-d632a3f60f68/subscriptions-always-invalid-usual-suspects-checked-no-joy?forum=sqlservicebroker

Entonces me encontré con este post, también muy sencillo de reducción del problema, sólo que la suya era una cuestión sencilla, que necesitan 2 nombre de la pieza para las tablas.En su caso, la sugerencia resuelto el problema.Después de mirar su código me di cuenta de que la principal diferencia estaba esperando a que abra el objeto de conexión hasta DESPUÉS de que el comando objeto Y el objeto de dependencia fueron creados.Mi única suposición es bajo el capó (todavía no he empezado reflector para comprobar tan sólo una suposición) el objeto de Conexión se abre de manera diferente, o el orden de los eventos y comandos suceder de manera diferente, porque de esta asociación.

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/bc9ca094-a989-4403-82c6-7f608ed462ce/sql-server-not-creating-subscription-for-simple-select-query-when-using-sqlcachedependency?forum=sqlservicebroker

Espero que esto ayude a alguien más en un problema similar.

Otros consejos

Sólo una conjetura, pero podría ser debido a su estado de SELECT no tiene una cláusula ORDER BY?

Si no se especifica un orden explícita entonces es posible para que la consulta devuelve los resultados en cualquier orden cada vez que se ejecuta. Tal vez esto está causando el objeto SqlCacheDependency pensar que los resultados han cambiado.

Trate de añadir una cláusula 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

No soy un experto en SqlCacheDependency, de hecho, me encontré con esta pregunta, mientras que en busca de respuestas a mis problemas con ella! Sin embargo, creo que la razón de su SqlCacheDependency no está funcionando se debe a su SQL contiene una consulta sub anidado.

Tome un vistazo a la documentación que enumera lo que puede / no se puede utilizar en su SQL: Creación de una consulta de notificación

".... La declaración no debe contener subconsultas, combinaciones externas, o autocombinaciones ....."

También encontré algo de información muy valiosa solución de problemas de un tipo en Redgate aquí: uso y seguimiento SQL 2005 notificación de consulta que me ayudó a resolver mi problema: mediante el uso de SQL para rastrear los eventos QN sugiere, yo era capaz de detectar mi conexión era incorrecta usando la opción 'SET ARITHABORT OFF', haciendo que mis notificaciones fallen.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top