---
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
