2011-03-17 25 views
6

Escribí un programa que genera archivos PDF a partir de un Informe de Crystal, luego envía esos archivos PDF a alguien. El programa funciona muy bien en mi máquina de desarrollo, pero cuando copio el directorio bin \ Release en el servidor de Windows 2000 (máquina donde me gustaría ejecutarlo), comienza a ejecutarse y luego genera este error y stack trace:Error al utilizar Crystal Reports para .net

The type initializer for 'CrystalDecisions.CrystalReports.Engine.ReportDocument' threw an exception. 
    at CrystalDecisions.CrystalReports.Engine.ReportDocument..ctor() 
    at DailyJobCostSummaryEmail.Program.crptToPDF(String reportFile, String jobNum, String outputLocation) in M:\Projects\DailyJobCostSummaryEmail\DailyJobCostSummaryEmail\Program.cs:line 79 
    at DailyJobCostSummaryEmail.Program.Main(String[] args) in M:\Projects\DailyJobCostSummaryEmail\DailyJobCostSummaryEmail\Program.cs:line 46 

EL ERROR OCURRE EN TODAS PARTES, EXCEPTO CUANDO SE EJECUTA EN VISUAL STUDIO.

.Net 2.0 está instalado en esa máquina, y desde entonces he instalado CRRedist2005_x86.msi sin ningún efecto. Incluso recibo el cuadro de diálogo "Enviar informe de error a Microsoft", aunque estoy usando try/catch para imprimir la excepción en un archivo. Incluso cuando se ejecuta el bloque catch, mi programa no se cierra correctamente.

static void Main(string[] args) 
{ 
    try 
    { 
     String dir = @"JobCostReports"; 
     DataTable jobs = new DataTable(); 

     using (SqlConnection conn = new SqlConnection(connString)) 
     { 
      String sql = "JC_GetJobsClosedYesterday"; 
      SqlDataAdapter da = new SqlDataAdapter(sql, conn); 
      da.Fill(jobs); 
     } 

     List<String> files = new List<String>(); 

     foreach (DataRow row in jobs.Rows) 
     { 
      files.Add(crptToPDF(@"JobCost.rpt", row["JobNumber"].ToString().TrimEnd(), dir)); 
     } 

     Utilities.sendEmail("[toEmail]", 
          "[FromEmail]", 
          "Job Cost Summaries for Yesterday", 
          "Attached are Job cost summaries for the " + files.Count + " jobs closed yesterday.", 
          files.ToArray()); 

     Console.WriteLine("Email sent."); 
    } 
    catch (Exception e) 
    { 
     using (StreamWriter writer = new StreamWriter("errors.log", true)) 
     { 
      writer.AutoFlush = true; 
      Console.WriteLine(); 
      writer.WriteLine(e.Message); 
      writer.WriteLine(e.StackTrace); 
     } 

     Console.WriteLine(e.Message); 
     Console.WriteLine(e.StackTrace); 
     Console.Read(); 
    } 
    finally { } 
} 

public static String crptToPDF(String reportFile, String jobNum, String outputLocation) 
{ 
    using (ReportDocument rpt = new ReportDocument()) 
    { 
     rpt.Load(reportFile); 
     rpt.SetParameterValue("@vJobNumber", jobNum); 
     String output = outputLocation + @"\" + jobNum + "_JobCostSummary.pdf"; 
     rpt.ExportToDisk(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat, output); 
     return output; 
    } 
} 

¿No incluyo todas las referencias adecuadas y las declaraciones de uso? He intentado muchas combinaciones, pero sin efecto.

+2

Intente actualizar su registro para incluir la excepción InnerException.Message también. Eso te dirá qué error está arrojando 'ReportDocument..ctor', lo que te dará más para trabajar. –

+0

* "EL ERROR OCURRE EN TODAS PARTES, EXCEPTO CUANDO SE EJECUTA DESDE VISUAL STUDIO." * ¿Ocurre también en su máquina cuando se ejecuta desde el directorio/bin? He tenido errores similares debido a dependencias faltantes ... –

Respuesta

0

This parece estar relacionado. ¿Has probado los pasos descritos allí?

+0

Sí, encontré ese antes. No dados. ¿Se puede instalar un módulo de fusión solo? – MAW74656

+0

@ MAW74656 - No, se debe incluir un módulo de fusión en un MSI real. Ver [esto] (http://social.msdn.microsoft.com/forums/en-US/winformssetup/thread/038f14ad-d4e7-4f15-93c6-d9525ecb1abd). – CodeNaked

+0

No he usado módulos de combinación antes. ¿Cómo agrego a mi instalador? – MAW74656

0

Compruebe que las configuraciones de solución de depuración y liberación en Visual Studio tienen las mismas dependencias y configuraciones y que todas las rutas de dependencia son relativas; cuando las cosas funcionan en VS pero no afuera, generalmente encuentro que es uno de esos problemas de remolque.

+0

Depurar y liberar son lo mismo. Todos los caminos son relativos. – MAW74656

0

Un truco rápido y sucio. Esperando que funcione.

AFAI puede entender, pueden ser los refereneces que faltan en la producción o la versión a juego. Entonces, para superar esto, desde su solución, vaya al directorio de referencias thr -> Seleccione la referencia-> Haga clic con el botón derecho en la referencia -> Seleccionar propiedad -> luego seleccione Copiar local - Verdadero. Ahora construya su aplicación y copie el nuevo directorio bin y las páginas a producción y verifique si se está ejecutando o no. Si todavía no se está ejecutando, vuelva a pasar a la propiedad de la referencia, elija la ruta. Si está en GAC, busca en google para copiar archivos DLL de GAC. O bien, puede asignar su carpeta de Windows a la misma máquina y acceder, luego navegar por el directorio y copiar los dlls, pero para esto necesita los privilegios de administrador. Ahora cree un nuevo directorio dentro de la solución, asígnele el nombre CRDist, pegue todos los archivos DLL dentro de la carpeta y haga referencia desde allí, en el extremo de producción, abra el Símbolo del sistema y registre el dll usando la ruta regsvr32 -i dll.

también en sus MECANISMO PDF exportadores,

puedo ver que va a cargar archivo de informe, pero que no está utilizando cualquier fuente de datos. ¿Está configurando el origen de datos en designtime o lo que está pasando detrás de los escenarios?

Espero que esto ayude

+0

El informe de cristal tiene la fuente de datos programada en él, así que no tengo que meterme con él desde el código. Honestamente, Crystal Reports para .NET están resultando ser más problemáticos que valiosos. Voy a probar todo esto por la mañana, pero de cualquier manera, voy a buscar algo para una plataforma de informes más fácil de usar. Por supuesto, mis elecciones son gratis o nada, así que probablemente estoy atascado. – MAW74656

+0

SUGERENCIA: Si está utilizando el servidor Sql, use OleDb en lugar de Sql Native API para generar informes. –

+0

Estoy usando el servidor SQL; ¿puedes ampliar tu sugerencia? No estoy entendiendo del todo. Use Oledb? ¿Dónde? Tampoco estoy usando mi código, los datos provienen del conjunto de datos declarado en el archivo de informe. – MAW74656

0

Para registrar el conjunto gestionado. Utilice esta

C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322>RegAsm.exe /tlb dllName.dll 
Microsoft (R) .NET Framework Assembly Registration Utility 1.1.4322.573 
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved. 


Here v1.1.4322 will the framework you are developing. Choose the framework 
accordingly. Or goto Start->AllPrograms -> MicrosoftVisual Studio 2005/8/10-> 
Visual Studio Tools-> Visual Studio Command Prompt. 
then run RegAsm.exe /tlb dllName.dll 
+0

¿En qué PC debo ejecutar? Dev o Target? – MAW74656

0

El servidor está mal configurado me temo. Vuelva a instalar los tiempos de ejecución desde SAP (NO VS) que puede encontrar haciendo búsquedas en Google.Cuando dice que desea ejecutarlo en el servidor, ¿lo está ejecutando como un sitio web o es el caso de que esté retirando el RPT en una red compartida o qué? Si es el sitio web, entonces es casi sin lugar a dudas una instalación mal configurada de Crystal en el servidor, no su informe como tal.

No creo, pero no estoy seguro, que la instalación en tiempo de ejecución le pedirá una clave de producto en cualquier momento, ya que solo está utilizando el visor gratuito, etc. Si está recibiendo una solicitud de una clave de producto, entonces no está instalando los tiempos de ejecución puros, me temo.

Cuestiones relacionadas