none
un try cath dentro de un ciclo foreach RRS feed

  • Pregunta

  • miren este codigo

    public override int Altas(IEnumerable<Categoria> lista)
            {
                sql.Conectar();
                int numero = 0;
                
                foreach (Categoria categoria in lista)
                {
                    sql.query = @"insert into Categorias(descripcion)Values(@descripcion)";
                    SqlCommand sqlCommand = sql.ComandoConexionManual(sql.query);
                    sqlCommand.Parameters.AddWithValue("@descripcion", categoria.descripcion);
                    numero += sqlCommand.ExecuteNonQuery();
                }
                sql.Desconectar();
                return numero;
            }

    ese codigo inserta la lista en la base de datos recorriendola y me regresa el numero de filas afectadas, funciona perfectamente

    pero si yo quisiera poner un try catch para validar una insertcion al momento de no poder insertar se detendria, por ejemplo que la lista tenga 10 categorias y va en la insercion numero 4, y en la 5 fallara la insercion pues hay me sacaria del y enviaria el mensaje de error

    pero yo no quiero eso, yo quisiera que llegara a la 4 no pudiera insertar, y se pasara a insertar el 5,  y asi hasta llegar al final, a los 10 en este caso,

    que me retornara el numero de filas afectadas, y los registros que no se pudieron copiar, para intentarlo de nuevo. no quiero que se detenga, queiro que continue y emvie el mensaje

    miércoles, 31 de octubre de 2012 5:58

Respuestas

  • necesitas mostrarle el mensaje del error al usuario o provocarle un Error?

    pero estas en una aplciacion de consolta porque no usas

    public override List<string> Altas(IEnumerable<Categoria> lista)
    {
    	sql.Conectar();
    	List<string> list = new List<string>();
    	int afectados = 0;
    	
    	foreach (Categoria categoria in lista)
    	{
    		try 
    		{	
    			sql.query = @"insert into Categorias(descripcion)Values(@descripcion)";
    			SqlCommand sqlCommand = sql.ComandoConexionManual(sql.query);
    			sqlCommand.Parameters.AddWithValue("@descripcion", categoria.descripcion);
    			afectados += sqlCommand.ExecuteNonQuery();
    		} 
    		catch (Exception ex) {
    			list.Add(ex.message);
    		}
    	}
    
    	list.Add(string.Format("Registro afectados {0}", afectados));
    	
    	sql.Desconectar();
    	return list;
    }

    y lo usarias

    BusinessCategoria businessCategoria = new BusinessCategoria();
    List<string> mensajes = businessCategoria.Altas(lista);
    
    foreach(string item in mensajes)
    	Console.WriteLine(item);
    	
    Console.Read();


    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta niqel jueves, 1 de noviembre de 2012 19:11
    jueves, 1 de noviembre de 2012 5:43

Todas las respuestas

  • Y ¿no has probado a programar lo que comentas? No sé si funcionaría, pero algo parecido a esto debería andar

    public override string[] Altas(IEnumerable<Categoria> lista) { sql.Conectar(); int numero = 0;

    string afectadas = "";

    string[] resultados; foreach (Categoria categoria in lista) { try{ sql.query = @"insert into Categorias(descripcion)Values(@descripcion)"; SqlCommand sqlCommand = sql.ComandoConexionManual(sql.query); sqlCommand.Parameters.AddWithValue("@descripcion", categoria.descripcion); numero += sqlCommand.ExecuteNonQuery(); } catch{ afectadas = afectadas + ";" + categoria.descripcion; } } sql.Desconectar(); resultados[0] = numero.ToString();

    resultados[1] = afectadas;

    return afectadas; }

    Yo diría que algo así funcionaría...y si no funciona, jugando con las ordenes break y continue dentro del for seguro que al final termina andando :P O si no, pues mirando el valor devuelto por 

    sqlCommand.ExecuteNonQuery()

    también sabrías si se ha insertado lo que querías o no, ¿no?

    Siento no poder ser de mucho ayuda ^^, saludos.



    • Editado fjbgcmbsgr miércoles, 31 de octubre de 2012 7:46
    miércoles, 31 de octubre de 2012 7:42
  • hey muchas gracias por la idea

    siento que no es necesario una matrix

    mira este codigo

    public override int Altas(IEnumerable<Categoria> lista)
            {
                sql.Conectar();
                int numero = 0;
                
                foreach (Categoria categoria in lista)
                {
                    try
                    {
                        sql.query = @"insert into Categorias(descripcion)Values(@descripcion)";
                        SqlCommand sqlCommand = sql.ComandoConexionManual(sql.query);
                        sqlCommand.Parameters.AddWithValue("@descripcion", categoria.descripcion);
                        
                        numero += sqlCommand.ExecuteNonQuery();
                    }
                    catch (Exception ex)
                    {
                        ex = new Exception(Infrastructure.ExceptionMessages.error3 += Environment.NewLine + categoria.descripcion);
                        throw ex;
                    }
                    
                }

    el numero de afetados se demuestra y segun yo voy haciendo crecer el mensaje del exeption pero el problema es que lo recojo

    esa exeption en la capa de datos y me saca, no continua, en la primera ves que encuentra un error

    miércoles, 31 de octubre de 2012 15:00
  • public override int Altas(IEnumerable<Categoria> lista)
            {
                sql.Conectar();
                int numero = 0;
                try 
    			{
    				foreach (Categoria categoria in lista)
    				{
    					sql.query = @"insert into Categorias(descripcion)Values(@descripcion)";
    					SqlCommand sqlCommand = sql.ComandoConexionManual(sql.query);
    					sqlCommand.Parameters.AddWithValue("@descripcion", categoria.descripcion);
    					numero += sqlCommand.ExecuteNonQuery();
    				}
    			} catch (Exception ex) {
    				MessageBox.Show(ex.message, "¡ERROR!",MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    				numero = -1;
    			}
                sql.Desconectar();
                return numero;
            }

    A ver si así  te vale, solo he añadido lo que necesitas, mostrarle al usuario el Error, y retornar un valor negativo para errores.

    Una cosa, necesitas mostrarle el mensaje del error al usuario o provocarle un Error?


    daviel

    miércoles, 31 de octubre de 2012 15:07
  • a claro a la mejor no mostrado todo el codigo ve esto

    esa una mini apicacion consola que hice para probar

    static void Main(string[] args)
            {
                int numero = 0;
                Console.WriteLine("agregue una 5 categorias");
                List<Categoria> lista = new List<Categoria>();
                Categoria categoria = new Categoria();
                categoria.descripcion = Console.ReadLine();
                lista.Add(categoria);
                categoria = new Categoria();
                categoria.descripcion = Console.ReadLine();
                lista.Add(categoria);
                categoria = new Categoria();
                categoria.descripcion = Console.ReadLine();
                lista.Add(categoria);
                categoria = new Categoria();
                categoria.descripcion = Console.ReadLine();
                lista.Add(categoria);
                categoria = new Categoria();
                categoria.descripcion = Console.ReadLine();
                categoria.id = 1;
                lista.Add(categoria);
                categoria = new Categoria();
                try
                {
                    BusinessCategoria businessCategoria = new BusinessCategoria();
                    numero = businessCategoria.Altas(lista);
                    Console.WriteLine("Numero de filas afectadas " + numero.ToString());
                    Console.Read();
                }
                catch(Exception ex)
                {
                    Console.WriteLine("Filas afectadas " + numero);
                    Console.WriteLine(ex.Message);
                }
                
                Console.Read();

    creo que el problema que tengo esta aqui como adiquiero la exepcion
    miércoles, 31 de octubre de 2012 15:27
  • creo que lo que yo necesito es tomar la exepcion mandada por la capadedatos, pero que continue la aplicacion, no se como hacer para que continue.

    miércoles, 31 de octubre de 2012 16:07
  • Yace loq ue necesito, necestio un goto, solo que tendre que estudiar como funciona
    miércoles, 31 de octubre de 2012 17:26
  • Amigo, no es que tenga nada en contra del GoTo, pero mi consejo es que intentes de hacerlo sin saltos de linea

    daviel

    miércoles, 31 de octubre de 2012 23:29
  • necestio un goto, solo que tendre que estudiar como funciona

    olvidate del goto inmediatamente, esta terminantemente prohibido en cualquier desarrollo usar el goto

    es mas tendria que existir una pena que le corte la mano a cualquier desarrollador que use goto, ojo no es chiste va en serio

    descarta  goto como posible solucion, si evaluas que lo tienes que usar es porque estas realizando todo mal


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 1 de noviembre de 2012 5:36
  • necesitas mostrarle el mensaje del error al usuario o provocarle un Error?

    pero estas en una aplciacion de consolta porque no usas

    public override List<string> Altas(IEnumerable<Categoria> lista)
    {
    	sql.Conectar();
    	List<string> list = new List<string>();
    	int afectados = 0;
    	
    	foreach (Categoria categoria in lista)
    	{
    		try 
    		{	
    			sql.query = @"insert into Categorias(descripcion)Values(@descripcion)";
    			SqlCommand sqlCommand = sql.ComandoConexionManual(sql.query);
    			sqlCommand.Parameters.AddWithValue("@descripcion", categoria.descripcion);
    			afectados += sqlCommand.ExecuteNonQuery();
    		} 
    		catch (Exception ex) {
    			list.Add(ex.message);
    		}
    	}
    
    	list.Add(string.Format("Registro afectados {0}", afectados));
    	
    	sql.Desconectar();
    	return list;
    }

    y lo usarias

    BusinessCategoria businessCategoria = new BusinessCategoria();
    List<string> mensajes = businessCategoria.Altas(lista);
    
    foreach(string item in mensajes)
    	Console.WriteLine(item);
    	
    Console.Read();


    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta niqel jueves, 1 de noviembre de 2012 19:11
    jueves, 1 de noviembre de 2012 5:43