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:
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.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); } }
Este es el code que se encarga de manejar la insercion:
Código:
Sabe alguien el porque no funciona como crei que iba a funcionar?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(); } }
Gracias
