2009-05-07 17 views
12

Dado: Un motor de cálculo de C# que carga un modelo de objetos, procesa grandes cantidades de números y guarda los resultados en un par de gigantescas tablas de bases de datos megaindexadas en SQL Server. Esas tablas proporcionan datos a las interfaces web, otros módulos de software y los informes de SQL Server Reporting Services 2005.¿Cómo obtengo datos que no pertenecen a Table en SQL Server Reporting Services?

Logré hacer que el motor fuera un lote más rápido en la última versión del software, lo suficientemente rápido ahora que puede proporcionar los datos a petición, a veces incluso más rápido que el tiempo necesario para consultar la base de datos -calculado números. Estoy muy feliz por esto

Ese avance significa que podemos generar datos bajo pedido para las interfaces web y otros módulos de software. Pero las tablas de caché no pueden morir todavía, porque son consumidas por los informes de SSRS (o más específicamente, por procedimientos almacenados que consultan las tablas y proporcionan los datos a SSRS).

Las tablas de caché son un problema, en gran parte de la misma manera que cualquier caché es un dolor en el mundo del software. Sin entrar en demasiados detalles, tienen problemas de sincronización, problemas de bloqueo, etc. El software funcionaría mucho mejor si no tuviera que preocuparme por mantener actualizadas esas tablas.

Pero, ¿de qué otro modo puedo obtener los datos en SSRS? Investigué un poco y nada parece muy prometedor:

  • Podríamos proporcionar los datos a través de un servicio web y usar el SSD XML DPE. Pero eso parece espantoso. ¿Tengo razón en que tienes que analizar tu sobre SOAP? ¿Y no es compatible con XPath, sino con un dialecto propio de XPath-y? Nuestros redactores de informes conocen T-SQL, y eso es lo que mejor saben hacer.
  • El uso de SQL CLR para alojar nuestra API no es deseable: es una gran aplicación y no se puede hacer nada sin crear un objeto de aplicación e iniciar sesión, etc.
  • Uso de SQL CLR para contactar un servicio web en la aplicación web: esta es la más prometedora hasta ahora (este artículo fue útil http://www.simple-talk.com/sql/sql-server-2005/practical-sql-server-2005-clr-assemblies/.) ¿Alguien ha intentado este enfoque? ¿Funciona bien, puede proporcionar grandes conjuntos de datos? OTOH Estoy desconectado por la configuración adicional que tendríamos que hacer en los servidores de base de datos del cliente.
  • Cualquier otra sugerencia sería muy apreciada.
+0

He añadido una recompensa para cualquiera que pueda proporcionarme buena experiencia/información/especificaciones/números acerca de si sacar provecho de esto con SQLCLR/Web Services es manejable, o cualquier otra buena idea para ayudar con esta situación. –

+0

Hola, ¿entiendo correctamente que las tablas de caché son utilizadas principalmente por SSRS, con el propósito de informar? Parece que informar es un aspecto de su aplicación/soluciones, pero debido a ese aspecto, está causando un desagradable trabajo de BD, con el propósito de informar. –

+0

Eso es correcto Rihan. Los informes son un componente de la aplicación, y las tablas desagradables existen solo para proporcionar datos para los informes. –

Respuesta

9

Si le entiendo correctamente, está creando un informe sobre datos que no son SQL. Está almacenando los datos en tablas con el propósito específico de hacerlos notificables.

Puedo pensar en dos soluciones. El primero es extender su motor de cálculo C# con un reporting part. Los espacios de nombres Microsoft.Reporting.WinForms y Microsoft.Reporting.WebForms se pueden usar para generar informes en cualquier origen de datos, no solo SQL Server. Si los usuarios finales usan su aplicación como cliente, puede generar los datos y los informes sobre la marcha.

El segundo es usar el SQL CLR. Puede usar un procedimiento almacenado CLR como base para un informe (ingrese "exec mysp" como fuente de datos). Este procedimiento CLR es código C# y podría incluir su motor de cálculo como una biblioteca. Esto le permitiría generar informes sobre la marcha, mientras sigue utilizando la interfaz de usuario del servidor de informes.

Interesante pregunta y espero que la gente con más conocimientos pueden proporcionar una mejor respuesta :)

+0

¡Las partes de informes son muy interesantes! No había encontrado eso todavía. Lamentablemente, nuestros clientes confían en las funciones de SSRS, como la entrega automática y la programación de informes, por lo que no bastará con aumentar nuestros propios informes para un subconjunto de los informes de la aplicación. –

+0

¿Eso significa que vas a hacer el SQL CLR entonces? – Gator

+0

Gator, significa que tengo que buscar una opción que me permita representar los informes de SSRS desde el servidor de SSRS. Eso podría significar SQLCLR, SQLCLR-WebService, WebService-XMLDPE o cualquier otra idea que surja. –

3

He estado en una situación similar anteriormente y trató tanto la fuente de datos XML SSRS y la extensión de informes que menciona Andomar .Mi recomendación es usar la función de fuente de datos XML de SSRS. Si la estructura de datos devuelta por el servicio web es simple, el XPath también es simple. También me pareció más fácil de depurar. Lo principal a tener en cuenta es el tiempo de espera.

Lo bueno de usar servicios web es que son fácilmente consumidos por muchas tecnologías diferentes, por lo que pueden ser muy útiles para tener de todos modos.

Además, es una opción personal, pero a pesar de las características de SQL CLR, todavía no me siento cómodo con poner el código en la base de datos. Al utilizar una fuente de datos XML en SSRS, no es necesario involucrar ningún código CLR personalizado.

+0

+1 La pregunta menciona "Usar el CLR de SQL para contactar un servicio web en la aplicación web", pero con un origen de datos XML puede ponerse en contacto con el servicio web sin el SQL CLR. – Andomar

+0

Derecha. Eso es a lo que me refiero, se aclarará. –

3

Puede ajustar sus datos en un ADO.NET DataSet and use it as a Reporting Services Data Source..

Nunca he usado esto personalmente, así que no puedo darle mucha más información. Sin embargo, sabía que podías hacer esto de una clase de SSRS a la que asistí. El ejemplo que me dio el instructor cuando harías esto en un ejemplo del "mundo real" sería si necesitas unir datos de dos fuentes de datos diferentes. Por ejemplo, haría esto si quisiera correlacionar datos de SQL Server y Oracle en un solo informe.

Sé que esto no es lo que quieres hacer, pero parece que proporcionaría la misma capa de abstracción que necesitas.

+0

Una extensión de procesamiento de datos personalizada es definitivamente una idea nueva en esta discusión. El ejemplo describe un ADO.NET DPE personalizado que lee archivos xml corregidos desde ubicaciones de discos, obviamente no es muy práctico en el mundo real. Creo que podría crear un DPE que tome una URL de servicio web como su cadena de conexión, luego un nombre de método con valores de parámetros como la consulta: ¿suena bien? –

+0

Nunca lo he implementado, así que no puedo darte ningún consejo práctico por experiencia. Dicho esto, eso suena como el enfoque que tomaría. ¿Ya tienes un servicio web para usar? Si es así, enmascarar sus llamadas detrás de las interfaces .NET Data Provider (esque) suena como el camino a seguir. Si no es así, y tiene una biblioteca .NET, entonces quizás sería mejor enganchar sus métodos API. Evitaría la sobrecarga de SOAP y otras cosas. Esta fue una de esas cosas que escondí en el fondo de mi mente y que nunca tuve la oportunidad de usar personalmente. –

2

¿Ha considerado escribir su propio controlador de base de datos personalizado que se encuentra en la parte superior de su motor de cálculo? A continuación, puede señalar los servicios de informes directamente. Esto mantendría las cosas rápido, aunque puede ser una tarea complicada. Lo consideré en el pasado para el software propietario de almacenamiento de datos en el que estaba trabajando, pero nunca tuve la oportunidad de construir el controlador.

Una gran pregunta por cierto.

+0

Chris, señala para fuera de la caja con seguridad, pero no estoy seguro de que el trabajo adicional ofrezca ningún beneficio sobre la escritura de una extensión de procesamiento de datos de SSRS personalizada, o el uso del ADO personalizado de DPE publicado por Aaron Daniels. –

+0

El beneficio que ofrece es que cualquier cosa que pueda consumir ADO.Los datos de NET se convierten en un consumidor potencial de su sistema. Por ejemplo, podría vincular una hoja de cálculo de Excel directamente a su sistema. –

+0

Además de lo que dijo Peter, apostaría a que se beneficiaría de una ganancia de rendimiento con respecto al otro método. –

1

Usando el CLR SQL para ponerse en contacto con un servicio web en la aplicación web

Esta es la forma en que recomiendo - Hice esto para tener acceso a los datos de lista de SharePoint a través de sus servicios web. Si se puede arreglar el esquema de datos, un SQL CLR TVF puede ser una buena opción y ofrece la mayor flexibilidad. Si necesita que el esquema se determine en tiempo de ejecución, un procedimiento almacenado de CLR de SQL es lo que desea, ya que no está vinculado a un esquema.

Las cosas claves que necesita es:

-- enable CLR on the server 
sp_configure 'clr_enabled', 1 
GO 
RECONFIGURE 
GO 

-- allow your db to execute clr code marked EXTERNAL or UNSAFE 
alter database mydb set trustworthy on 

a continuación, crear un proyecto SQL CLR VS (que no tiene que ayude pero con la implementación y depuración de ella), establecer el nivel de permiso para 'externo'. Si usa "Agregar referencia web" en el proyecto VS, tendrá que activar la generación del conjunto de serialización y CREAR ENSAMBLAJE para cargarlo después de compilar/implementar.

Esto es un poco ondulado a mano en este momento - honesto, he hecho esto - añadiré más detalles más adelante. Dije una charla sobre SQL CLR el mes pasado. Mi sample code tiene el proyecto GetFibs que llama a un servicio web (Fibonnaci) que también está incluido.

También echa un vistazo aquí: http://footheory.com/blogs/bennie/archive/2006/12/07/invoking-a-web-service-from-a-sqlclr-stored-procedure.aspx y http://www.codeproject.com/KB/database/SQLCLR.aspx?display=Print

Qué se realizan bien, puede proporcionar grandes conjuntos de datos?

Sí, parece funcionar bien.Con un poco de trabajo adicional, puedes construirlo de una manera más orientada a la transmisión en donde no consumirá memoria para todo el conjunto. Vea cómo en la muestra de rango o here.

1

Definitivamente iré al ADO.NET DPE road. Si su fuente de datos puede proporcionar los datos necesarios en tiempo real, entonces tendría más sentido. Se ahorrará 1,2 o 3 niveles, lo que sin duda mejorará el rendimiento general. Y no hablar de mantenimiento de cada layes de código. Exponer el número de datos cruzados como un conjunto de datos ADO.NET y permitir que sus servicios de informes lo consulten directamente, es lo mejor en mi opinión.

1

En SQL 2008 puede usar un paquete SQL SSIS como fuente de datos. Escriba un paquete SSIS para ejecutar su motor de cálculo sobre la marcha y generar un dataset .net en memoria (DataReaderDestination). Esto se puede usar para informar.

Cuestiones relacionadas