Foros del Web » Programación para mayores de 30 ;) » .NET »

Trasnsacciones con .NET

Estas en el tema de Trasnsacciones con .NET en el foro de .NET en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 12/02/2007, 09:19
Avatar de jhonwilliams  
Fecha de Ingreso: marzo-2004
Ubicación: Copacabana - Colombia
Mensajes: 1.484
Antigüedad: 20 años, 1 mes
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)
  #2 (permalink)  
Antiguo 12/02/2007, 13:30
Avatar de JonhyReyes  
Fecha de Ingreso: febrero-2007
Mensajes: 103
Antigüedad: 17 años, 2 meses
Puntos: 1
Re: Trasnsacciones con .NET

Es muy probable que .Net esta manejando las transacciones que se realizan a nivel de aplicacion y no al nivel de la base de datos, en Fox tuve la oportunidad de trabajar con transacciones y la manera en que lo hice fue enviando comandos de BEGIN TRANSACTION, Rollback y Commit de acuerdo con la transaccion, fue bastante sencillo y funcional.
Puedes configurar un comando al inicio de la lectura de las filas y manejar una variable booleana que te indique que si hay error se ejecute un rollback.

Espero haber ayudado
  #3 (permalink)  
Antiguo 12/02/2007, 16:07
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
Re: Trasnsacciones con .NET

no sé como tengas toda tu estructura pero el code que tienes obviamente no es transaccional ya que la transacción la tienes a nivel función que está dentro de un ciclo, entonces es normal que si falla no se haga rollback de todo...

Lo que podrías hacer es por ejemplo en tu clase inicializar la conexion y la transaccion para que cuando pase por las iteraciones (foreach) ya tenga su transacción

Echale un ojo (solo para que te dés una idea de lo que hablo)
http://www.reflectionit.nl/DAL.aspx

SAlu2 y cualquier duda por aqui andamos..
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net
  #4 (permalink)  
Antiguo 12/02/2007, 16:12
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Re: Trasnsacciones con .NET

la cosa es que la transaccion la estas manejando por cada insercion individual y no en el ciclo que inserta...
es decir, si tienes cinco elementos, manejas cinco transacciones, cinco veces abres la conexion, cuando deberia ser una sola vez...



saludos!

disculpas, creo que me tarde mucho en enviar el texto, jejejeeje
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:10.