none
Ayuda Log de errores RRS feed

  • Pregunta

  • Buenos días, tengo un pequeño con mi programa, estoy tratando de generar un log de errores, este debe mostrar el registro que no subio, si tenemos 500 registros y hay dos defectuosos deberia poder subir todos y a la final en el log de errores mostrar cuales no subieron, aunque en mi caso se queda trabado en la linea de registro que no subio, y sale despues este error: "System.StackOverflowException" este es mi codigo la verdad no se que pueda estar ocurriendo :S:

     //SqlDataReader reader;
                int jum = CountLinesInFile(@"C:\sql\resultados2.csv"); ;
                int cont = 0;
                    ShowPercentProgress("Processing...", cont, jum);
                    Thread.Sleep(100);
                
                        /* Lectura de datos desde archivo, 
                         * Carga de Archivos */
                        string[] lines = System.IO.File.ReadAllLines(@"C:\sql\resultados2.csv");
                        int noSubidos = 0;
                        try
                        {
                            foreach (string line in lines)
                            {
                                string[] cols = line.Split(',');
                                Console.WriteLine(cols[0] + "','" + cols[1] + "','" + cols[2] + "','" + cols[3] + "','" + cols[4] + "','" + cols[5] + "','" + cols[6] + "','" + cols[7]);
                                //cols[0] + cols[1] + cols[2] + cols[3] + cols[4] + cols[5] + cols[6] + cols[7]
                                string queryString2 = "insert into PRUEBA (periodo_cierre, ciclo, categoria, estrato, nivel_tension, total_valor_cargo, total_consumo, tipocargo) values('" + cols[0] + "','" + cols[1] + "','" + cols[2] + "','" + cols[3] + "','" + cols[4] + "','" + cols[5] + "','" + cols[6] + "','" + cols[7] + "')";
                                //cols[0] + "','" + cols[1] + "','" + cols[2] + "','" + cols[3] + "','" + cols[4] + "','" + cols[5] + "','" + cols[6] + "','" + cols[7]
                                command = new OdbcCommand(queryString2, conn);
                                /*int resp =*/
                                command.ExecuteNonQuery();
                            }
                        }
                        catch (Exception ex)
                        {
                            noSubidos++;
                            ErrorLog(ex.Message);
                        }
                        using (StreamWriter w = File.AppendText(@"C:\sql\log_" + DateTime.Now.ToLongDateString() + ".txt"))
                        {
                            string msg = "Tabla PRUEBA \n";
                            Log(msg + "\n" + noSubidos + "\n"+ "registros", w);
                            // Close the writer and underlying file.
                            w.Close();
                        }
                        // Open and read the file.
                        using (StreamReader r = File.OpenText(@"C:\sql\log_" + DateTime.Now.ToLongDateString() + ".txt"))
                        {
                            DumpLog(r);
                        }
                    
                //Console.ReadLine();
                        conn.Close();

    y este es el metodo de ErrLog

    public static void ErrorLog(string Message)
            {
                StreamWriter sw = null;
                try
                {
                    string sLogFormat = DateTime.Now.ToShortDateString().ToString() + " " + DateTime.Now.ToLongTimeString().ToString() + " ==> ";
                    string sPathName = @"C:\sql";
                    string sYear = DateTime.Now.Year.ToString();
                    string sMonth = DateTime.Now.Month.ToString();
                    string sDay = DateTime.Now.Day.ToString();
                    string sErrorTime = sDay + "-" + sMonth + "-" + sYear;
                    sw = new StreamWriter(sPathName + "SMSapplication_ErrorLog_" + sErrorTime + ".txt", true);
                    sw.WriteLine(sLogFormat + Message);
                    sw.Flush();
                }
                catch (Exception ex)
                {
                    ErrorLog(ex.ToString());
                }
                finally
                {
                    if (sw != null)
                    {
                        sw.Dispose();
                        sw.Close();
                    }
                }
            }

    Gracias por su tiempo y colaboracion
    viernes, 29 de junio de 2012 16:38

Respuestas

  • No trate de mover line.  Mueva cols[].

                int jum = CountLinesInFile(@"C:\sql\resultados2.csv"); ;
                int cont = 0;
                    ShowPercentProgress("Processing...", cont, jum);
                    Thread.Sleep(100);
                
                        /* Lectura de datos desde archivo, 
                         * Carga de Archivos */
                        string[] lines = System.IO.File.ReadAllLines(@"C:\sql\resultados2.csv");
                        int noSubidos = 0;
                        string[] cols = null;  //AQUÍ
                        try
                        {
                            foreach (string line in lines)
                            {
                                cols = line.Split(',');
                                Console.WriteLine(cols[0] + "','" + cols[1] + "','" + cols[2] + "','" + cols[3] + "','" + cols[4] + "','" + cols[5] + "','" + cols[6] + "','" + cols[7]);
                                //cols[0] + cols[1] + cols[2] + cols[3] + cols[4] + cols[5] + cols[6] + cols[7]
                                string queryString2 = "insert into PRUEBA (periodo_cierre, ciclo, categoria, estrato, nivel_tension, total_valor_cargo, total_consumo, tipocargo) values('" + cols[0] + "','" + cols[1] + "','" + cols[2] + "','" + cols[3] + "','" + cols[4] + "','" + cols[5] + "','" + cols[6] + "','" + cols[7] + "')";
                                //cols[0] + "','" + cols[1] + "','" + cols[2] + "','" + cols[3] + "','" + cols[4] + "','" + cols[5] + "','" + cols[6] + "','" + cols[7]
                                command = new OdbcCommand(queryString2, conn);
                                /*int resp =*/
                                command.ExecuteNonQuery();
                            }
                        }
                        catch (Exception ex)
                        {
                            noSubidos++;
                            ErrorLog(ex.Message);
                            ErrorLog(String.Format("Registro fallido:  {0}, {1}", cols[0], cols[1]));
                        }


    Jose R. MCP
    Code Samples

    • Marcado como respuesta Hurt24 viernes, 29 de junio de 2012 18:18
    viernes, 29 de junio de 2012 18:06
    Moderador
  • Eso es porque el try está cubriendo el foreach completo.  Si mueve el try adentro del foreach entonces no tendrá ese problema.  De hecho, si lo mueve dentro del foreach tendrá disponible la variable "line", que sería más conveniente para escribir al log.  También haría innecesaria la modificación de mover la definición de cols[] fuera del foreach.

    Jose R. MCP
    Code Samples

    • Marcado como respuesta Hurt24 viernes, 29 de junio de 2012 18:26
    viernes, 29 de junio de 2012 18:22
    Moderador

Todas las respuestas

  • El problema consiste en que usted vuelve a llamar a ErrorLog() si hay una excepción tratando de escribir al log (en el catch de la función).  Véalo de esta manera:  Si no pudo escribir al log la primera vez, ¿qué le hace pensar que podrá una siguiente vez?  Si hay un error en ErrorLog(), lo más sano es ignorarlo.

    Por cierto, ese finally que usted tiene se elimina usando using.


    Jose R. MCP
    Code Samples

    viernes, 29 de junio de 2012 16:43
    Moderador
  • me pregunto

    porque no usas una libreria para esto, como ser log4net

    http://social.msdn.microsoft.com/Forums/es/vcses/thread/b3e842e2-a0d8-4a66-a072-c6408f3c83d9


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    viernes, 29 de junio de 2012 16:49
  • quizas la pregunta suene tonta, soy un poco novato en esto mmm ese log4net no seria para C#.NET? yo estoy desarrollando una aplicación windows form, y este fragmento es de un codigo que desarrollo en Aplicación de consola
    viernes, 29 de junio de 2012 16:54
  • Ya elimine una de las reabundancias efectivamente ahora ya no me saca error, ahora el problema es que no me saca el archivo de error :/
    viernes, 29 de junio de 2012 16:57
  • Por alguna razón no puede escribir al log.  Ponga un punto de interrupción en el catch() de ErrorLog() para que examine la excepción que se está generando.

    Ah, también use System.IO.Path.Combine() para crear rutas de archivos.  Nunca haga las concatenaciones usted mismo.


    Jose R. MCP
    Code Samples


    viernes, 29 de junio de 2012 16:58
    Moderador
  • es una libreria para logs, es valida tanto para consola, winforms, web, etc

    o sea referencias uan libreria y la configuras


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    viernes, 29 de junio de 2012 16:59
  • Ven jose una pregunta, ya arregle pero internamente me sale ejemplo algo asi "29/06/2012 12:05:09 a.m. ==> ERROR [22018] [Microsoft][ODBC driver for Oracle][Oracle]ORA-01722: invalid number", pero mas que eso quiero que salga cual fue la linea erronea que en dado caso seria esta:

    a,2012206,3,0,1,1,9037125,0,Otros Ingresos

    al igual que siga cargando datos, ya que cuando llega a este registro se cierra el programa.

    viernes, 29 de junio de 2012 17:10
  • Supongo que esos son los valores de col[].  Entonces en el catch() que atrapa la excepción de inserción:

    catch (Exception ex)
    {
        noSubidos++;
        ErrorLog(ex.Message);
        ErrorLog(String.Format("Registro fallido:  {0}, {1}, {2}", col[0], col[1], col[2]));
    }

    Ese es un ejemplo que registra 3 columnas.  Usted reescríbalo para incluir cuantos valores de col[] usted quiera.


    Jose R. MCP
    Code Samples

    viernes, 29 de junio de 2012 17:32
    Moderador
  • pero mas que eso quiero que salga cual fue la linea erronea que en dado caso seria esta:

    pero para lograr eso entonces la variable lineas

    que defines

    foreach (string line in lines)

    debes ponerla por fuera del try

    string line

    try{

    .

    .

    de esa forma puedes accedes desde el catch cuando se produce el error y armar una linea de log

    string line =""
    try
    {
    	foreach (line in lines)
    	{
    		....
    	}
    }
    catch (Exception ex)
    {
    	noSubidos++;
    	ErrorLog(ex.Message + " linea:: " + line);
    
    }

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    viernes, 29 de junio de 2012 17:53
  • me sale error :/ dice que cols no esta en el contexto actual, pego el string de cols y em dice que line no esta en el contexto actual ya que line estaba arriba con el foreach queme recomiendas?
    viernes, 29 de junio de 2012 17:58
  • Pues mueva la definición de cols[] a un punto donde quede definido tanto el try como el catch.  Sería antes de iniciar el try.

    Jose R. MCP
    Code Samples

    viernes, 29 de junio de 2012 18:00
    Moderador
  • No trate de mover line.  Mueva cols[].

                int jum = CountLinesInFile(@"C:\sql\resultados2.csv"); ;
                int cont = 0;
                    ShowPercentProgress("Processing...", cont, jum);
                    Thread.Sleep(100);
                
                        /* Lectura de datos desde archivo, 
                         * Carga de Archivos */
                        string[] lines = System.IO.File.ReadAllLines(@"C:\sql\resultados2.csv");
                        int noSubidos = 0;
                        string[] cols = null;  //AQUÍ
                        try
                        {
                            foreach (string line in lines)
                            {
                                cols = line.Split(',');
                                Console.WriteLine(cols[0] + "','" + cols[1] + "','" + cols[2] + "','" + cols[3] + "','" + cols[4] + "','" + cols[5] + "','" + cols[6] + "','" + cols[7]);
                                //cols[0] + cols[1] + cols[2] + cols[3] + cols[4] + cols[5] + cols[6] + cols[7]
                                string queryString2 = "insert into PRUEBA (periodo_cierre, ciclo, categoria, estrato, nivel_tension, total_valor_cargo, total_consumo, tipocargo) values('" + cols[0] + "','" + cols[1] + "','" + cols[2] + "','" + cols[3] + "','" + cols[4] + "','" + cols[5] + "','" + cols[6] + "','" + cols[7] + "')";
                                //cols[0] + "','" + cols[1] + "','" + cols[2] + "','" + cols[3] + "','" + cols[4] + "','" + cols[5] + "','" + cols[6] + "','" + cols[7]
                                command = new OdbcCommand(queryString2, conn);
                                /*int resp =*/
                                command.ExecuteNonQuery();
                            }
                        }
                        catch (Exception ex)
                        {
                            noSubidos++;
                            ErrorLog(ex.Message);
                            ErrorLog(String.Format("Registro fallido:  {0}, {1}", cols[0], cols[1]));
                        }


    Jose R. MCP
    Code Samples

    • Marcado como respuesta Hurt24 viernes, 29 de junio de 2012 18:18
    viernes, 29 de junio de 2012 18:06
    Moderador
  • me sale el siguiente error, "no se puede encontrar un namesapce o directiva con el nombre "line"(falta una directiva using o un ensamblado)
    viernes, 29 de junio de 2012 18:12
  • Es su código, no el mío.  Yo lo único que hice fue copiar su código de la pregunta original y los únicos cambios que hice fueron los que ve usted en negrita.  Como puede ver, "line" sigue estándo definida dentro del foreach.

    Sería bueno que ponga el error y además muestra la línea de código que está generando dicho error.


    Jose R. MCP
    Code Samples

    viernes, 29 de junio de 2012 18:18
    Moderador
  • ya el error lo solucione, finalmente para no seguir molestando, se supone que despues dle registro dañado existen 4 registros mas pero e lega hasta el error y no continua, que hago para que continue?
    viernes, 29 de junio de 2012 18:21
  • Eso es porque el try está cubriendo el foreach completo.  Si mueve el try adentro del foreach entonces no tendrá ese problema.  De hecho, si lo mueve dentro del foreach tendrá disponible la variable "line", que sería más conveniente para escribir al log.  También haría innecesaria la modificación de mover la definición de cols[] fuera del foreach.

    Jose R. MCP
    Code Samples

    • Marcado como respuesta Hurt24 viernes, 29 de junio de 2012 18:26
    viernes, 29 de junio de 2012 18:22
    Moderador
  • Muchisimas gracias jose, al igual a ti leandro leere mas del log4net para estos futuros casos, muchisimas gracias
    viernes, 29 de junio de 2012 18:27