--- layout: post title: "Diseño de Software Incident" date: 2023-09-22T15:08:17+08:00 tags: ["old_blog"] math: false draft: false --- # Instanciacion del SqlConnection ```csharp using (var connection = new SqlConnection(configuration.GetConnectionString("DefaultConnection"))) ``` Eso genera un sql connection que va a existir hasta que salga del scope del programa. # Creacion del SqlCommand ```csharp using var command = new SqlCommand(); command.CommandText = "sp_RecuperaProductos"; command.CommandType = System.Data.CommandType.StoredProcedure; ``` # Apertura de la coneccion ```csharp command.Connection = connection; command.Connection.Open(); ``` ## Utilizacion del ExecuteReader Es un choclo pero basicamente el codigo de abajo se encarga de iterar por cada uno de las entradas de la tabla. **MUY** importante, se tiene que añadir los productos dentro del loop principal del reader ya que lo que no se guarde en cada iteracion se pierde. (los maps no son case sensitive). ```csharp var reader = command.ExecuteReader(); while (reader.Read())//lee a traves de todas las filas que existen en la tabla { //por cada fila que creo tengo que asignar manualmente cada columna con cada propiedad var producto = new Producto(); producto.Codigo = reader["Codigo"].ToString(); producto.Nombre = reader["Nombre"].ToString(); producto.Cantidad = Convert.ToInt32(reader["Cantidad"].ToString()); producto.CantidadMinima = Convert.ToInt32(reader["CantidadMinima"].ToString()); producto.Precio = Convert.ToDecimal(reader["Precio"].ToString()); var codigoCategoria = reader["CodigoCategoria"].ToString(); producto.Categoria = RepositorioCategorias.Instancia.RecuperarCategorias().FirstOrDefault(c => c.Codigo == codigoCategoria); ////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////// using var commandProveedores = new SqlCommand(); //otra forma de hacerlo es usando Store Procedures commandProveedores.CommandText = "sp_RecuperarProveedoresProducto"; commandProveedores.CommandType = System.Data.CommandType.StoredProcedure; commandProveedores.Parameters.Add("@CodigoProducto", System.Data.SqlDbType.NVarChar,25).Value = producto.Codigo; ///////////////////////// commandProveedores.Connection = connection; var readerProveedoresProducto = command.ExecuteReader(); while (readerProveedoresProducto.Read())//lee a traves de todas las filas que existen en la tabla { var codigoProveedor = readerProveedoresProducto["CodigoProveedor"].ToString(); var proveedor = RepositorioProveedores.Instancia.RecuperarProveedores().FirstOrDefault(x => x.Codigo == codigoProveedor); producto.AgregarProveedor(proveedor); //una vez cargado el objeto completo lo agrego a la coleccion } productos.Add(producto); } ``` # Cerrado de la coneccion NOTA: no ser mamerto y cerrar la coneccion fuera del while-loop. ```csharp command.Connection.Close(); ``` # Sub-Query ```csharp using var commandProveedores = new SqlCommand(); commandProveedores.CommandType = System.Data.CommandType.StoredProcedure; commandProveedores.CommandText = "SP_AGREGARPROVEEDORPRODUCTO"; commandProveedores.Connection = connection; commandProveedores.Transaction = sqlTransaction; commandProveedores.Parameters.Add("@CodigoProducto", System.Data.SqlDbType.NVarChar,25).Value = producto.Codigo; commandProveedores.Parameters.Add("@CodigoProveedor", System.Data.SqlDbType.NVarChar, 25); foreach (var proveedor in producto.Proveedores) { commandProveedores.Parameters["CodigoProveedor"].Value = proveedor.Codigo; commandProveedores.ExecuteNonQuery(); } ``` # Non-Query Un query es una consulta de tipo UPDATE, INSERT, DELETE, para el ExecuteNonQuery se devuelve la cantidad de ramas afectadas, menos en el uso de un StoredProcedure donde devuelve -1. # Notas > " Si compila y anda, aprueba " ~Laureano