2009-04-07 52 views
6

Esto es en C#, Visual Studio 2008, los informes de cristal que viene con VS2008informes de Crystal - cerrar la conexión de base de datos

Tengo una forma cristalina del visor de informes que reside en un archivo DLL. El archivo DLL es responsable de cargar el informe de Crystal (basado en el nombre de archivo del informe) y mostrar el informe en el formulario.

Cuando termine con el informe de cristal, invoco dispose en el objeto del documento de informe cargado. Sin embargo, la conexión de la base de datos permanece.

Crystal parece detectar que hay otras conexiones (desde mi aplicación principal) a la misma base de datos, y mantiene su conexión abierta. La conexión de cristal se cierra cuando la conexión de la base de datos de aplicaciones principal está cerrada.

¿Hay alguna manera de forzar el cristal para cerrar su conexión, sin cerrar la conexión de la base de datos de las aplicaciones principales?

Respuesta

0

No estoy muy familiarizado con Crystal Reports, pero hay muchos objetos que tienen un método Dispose() inútil debido a una cadena de herencia que incluye la interfaz IDisposable. Si no ve ningún problema de rendimiento en el servidor, entonces no se preocupe. GC se encargará de las conexiones de los clientes cuando esté listo. No deberías tratar de ser más inteligente que el GC, solo te darás más dolores de cabeza.

Y, siempre llame a Dispose() (o usando {}) cuando esté disponible.

+0

Esto es realmente acerca de la conexión a la base de datos. La aplicación principal tiene funcionalidad para restaurar y hacer una copia de seguridad de la base de datos. La conexión de cristal db evita esto. He tenido una furtiva en google, y la eliminación del informe cierra la conexión, pero solo si el cristal es lo único conectado. – user87945

+0

Supongo que está utilizando MSSQL, ¿correcto? ¿Por qué no usar la copia de seguridad/restauración integrada desde allí? – Ariel

+0

porque el producto está diseñado para ser utilizado por personas no técnicas. Tener dos elementos de menú que digan que la copia de seguridad/restauración es mucho más fácil de entender luego vaya al estudio de administración de sql, inicie sesión como usuario que tenga esos privilegios, etc. – user87945

1

¿Cómo se está conectando a la base de datos, creando su propia conexión en tiempo de ejecución mediante el establecimiento de la autenticación o está permitiendo que Crystal haga la conexión a través de la conexión almacenada en el informe? Si está haciendo su propia conexión de cualquier manera, forma o forma, debe cerrar manualmente la conexión y llamar al servicio de eliminación de desechos antes de eliminar el informe.

Es muy posible que se trate de una pérdida de memoria. He experimentado esto antes. También hay un problema de pérdida de memoria con Crystal Reports y se habla bastante en su foro, pero no se emitió ninguna corrección cuando lo estaba usando hace algunos años. Me deshice de Crystal para otras opciones.

0

Tuve el mismo problema, excepto que estoy usando Sybase. Hace poco escribí el código que escribí para deshacerme de la conexión (y eso no funcionó) cuando vi un error. Solucioné el error y, cruzando los dedos, ahora parece funcionar. Abrí casi 100 informes donde no pude abrir 10 antes. Si prueba esto, hágamelo saber si le funciona.

Esto es lo que estoy haciendo antes de cerrar la ventana que contiene el visor de Crystal Reports:

var rd = (ReportDocument)crystalReportViewer1.ReportSource; 
foreach (Table table in rd.Database.Tables) 
    table.Dispose(); 
rd.Database.Dispose(); 
rd.Close(); 
rd.Dispose(); 
GC.Collect(); 

Marcos

0

marcas de código parece aliviar un poco la situación, aunque es un poco hacia atrás , debería ser algo así como:

ReportDocument rd = (ReportDocument) viewer.ReportSource; 
foreach (Table table in rd.Database.Tables) 
    table.Dispose(); 
viewer.ReportSource = null; 
rd.Database.Dispose(); 
rd.Close(); 
rd.Dispose(); 
rd = (ReportDocument) viewer.ReportSource; 
GC.Collect(); 

Esto no completó completamente la fuga pero me ayudó.

Cuestiones relacionadas