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