Ver Mensaje Individual
  #1 (permalink)  
Antiguo 12/02/2007, 09:19
Avatar de jhonwilliams
jhonwilliams
 
Fecha de Ingreso: marzo-2004
Ubicación: Copacabana - Colombia
Mensajes: 1.484
Antigüedad: 20 años, 2 meses
Puntos: 76
Trasnsacciones con .NET

Hola.

Tengo una aplicacion que guarda datos en una tabla temporal, luego recorro esta tabla y por cada registro ejecuto el sp que inserta el dato en la tabla. Es decir si hay 10 registros se ejecuta el sp 10 veces.

Eso seria algo como esto:

Código:
foreach (DataRow r in tablaDatos.Rows)
                {
                    try
                    {
                        datos.IngresarDefectos(Convert.ToInt32(r["Posicion"].ToString()), 
                            r["Lado"].ToString(),r["Defecto"].ToString(),
                            r["FechaDefecto"].ToString(),r["Carne"].ToString(),
                            r["Area"].ToString(), r["Lote"].ToString(),
                            r["Maquina"].ToString(), Convert.ToInt32(r["Descarga"].ToString()),
                            r["FechaEmb"].ToString());
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
Con eso no hay problema todo funciona perfectamente, la duda surgio cuando me puse a pensar, ¿que ocurre si en el registro 5 falla el proceso de insercion?, los 4 anteriores insertaron en la tabla pero el 5 no y quisiera controlar eso, asi que cree una transaccion y para probarla use un breakpoint y cuando se estaba ejecutado el proceso por 5 vez cambie el nombre del sp en la base de datos, efectivamente fallo el proceso pero se insertaron los registros antes del fallo, y quisiera que no se insertara nada.

Este es el code que se encarga de manejar la insercion:
Código:
 public bool IngresarDefectos(int Posicion, string Lado, string Defecto, string FechaDefecto,
            string Carne, string Area,string Lote, string Maquina, int Descarga, string FechaEmboninado)
        {
            SqlConnection cnx = new SqlConnection(cnHisPOY);
            SqlParameter[] parametros = new SqlParameter[10];
            SqlCommand cmd = new SqlCommand();

            cnx.Open();
            //Iniciamos la transaccion
            SqlTransaction miTrans = cnx.BeginTransaction();
            try
            {
                parametros[0] = new SqlParameter("@Posicion", SqlDbType.Int);
                parametros[0].Value = Posicion;
                parametros[1] = new SqlParameter("@Lado ", SqlDbType.VarChar, 1);
                parametros[1].Value = Lado;
                parametros[2] = new SqlParameter("@Defecto", SqlDbType.VarChar, 4);
                parametros[2].Value = Defecto;
                parametros[3] = new SqlParameter("@FechaDefecto ", SqlDbType.DateTime);
                parametros[3].Value = FechaDefecto;
                parametros[4] = new SqlParameter("@Carne", SqlDbType.VarChar, 5);
                parametros[4].Value = Carne;
                parametros[5] = new SqlParameter("@Area", SqlDbType.VarChar, 4);
                parametros[5].Value = Area;
                parametros[6] = new SqlParameter("@Lote", SqlDbType.VarChar, 3);
                parametros[6].Value = Lote;
                parametros[7] = new SqlParameter("@Maquina", SqlDbType.VarChar, 5);
                parametros[7].Value = Maquina;
                parametros[8] = new SqlParameter("@Descarga", SqlDbType.Int);
                parametros[8].Value = Descarga;
                parametros[9] = new SqlParameter("@FechaEmbobinado", SqlDbType.VarChar, 10);
                parametros[9].Value = FechaEmboninado;

                foreach (SqlParameter p in parametros)
                {
                    cmd.Parameters.Add(p);
                }

                cmd.Connection = cnx;
            //Se asigna la transaccion al objeto command
                cmd.Transaction = miTrans;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "spESPOY";
                                
                cmd.ExecuteNonQuery();

            //Realizamos el commit
                miTrans.Commit();

                return true;
            }
            catch (Exception ex)
            {
            //Si falla hacemos el rollback
                miTrans.Rollback();
                return false;
            }
            finally 
            { 
                cnx.Close();
            }
        }
Sabe alguien el porque no funciona como crei que iba a funcionar?

Gracias
__________________
Si mi respuesta te ha ayudado, agradezco que me regales unos puntos de Karma XD.

"Una mujer sería encantadora si uno pudiera caer en sus brazos sin caer en sus manos." (Ambrose Bierce)