No image

Diseño de Software Incident

Publicado el: Sep 22, 2023
#old_blog

Instanciacion del SqlConnection

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

using var command = new SqlCommand();
command.CommandText = "sp_RecuperaProductos";
command.CommandType = System.Data.CommandType.StoredProcedure;

Apertura de la coneccion

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

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.

command.Connection.Close();

Sub-Query

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

← Volver