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