209 lines
14 KiB
HTML
209 lines
14 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="es">
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<title>Diseño de Software Incident</title>
|
|
<link rel="stylesheet" href="/css/main.css">
|
|
<link rel="stylesheet" href="/css/styles.css">
|
|
|
|
|
|
</head>
|
|
<body>
|
|
<main>
|
|
|
|
<nav class="bg-gray-800 fixed w-full top-0 z-1">
|
|
<div class="mx-auto px-4">
|
|
<div class="flex items-center justify-between h-16">
|
|
<div class="flex items-center">
|
|
<a href="/" class="text-white font-bold text-xl"
|
|
>Fede Landing Site</a
|
|
>
|
|
</div>
|
|
|
|
<div class="hidden md:flex">
|
|
<a
|
|
href="/Blog"
|
|
target="_blank"
|
|
class="text-gray-300 hover:text-white px-3 py-2"
|
|
>Blog</a
|
|
>
|
|
<a
|
|
class="text-gray-300 hover:text-white px-3 py-2 muted"
|
|
title="Under Construction 🚧👷♂️🏗️"
|
|
target="_blank"
|
|
>CV</a
|
|
>
|
|
<a
|
|
href="https://github.com/fedpo2"
|
|
target="_blank"
|
|
class="text-gray-300 hover:text-white px-3 py-2"
|
|
>GitHub</a
|
|
>
|
|
<a
|
|
href="mailto:federico.nicolas.polidoro@gmail.com"
|
|
target="_blank"
|
|
class="text-gray-300 hover:text-white px-3 py-2"
|
|
>Email</a
|
|
>
|
|
<a
|
|
href="https://www.linkedin.com/in/federico-polidoro-40137a25b/"
|
|
target="_blank"
|
|
class="text-gray-300 hover:text-white px-3 py-2"
|
|
>LinkedIn</a
|
|
>
|
|
</div>
|
|
|
|
<div class="md:hidden cursor-context-menu">
|
|
<button
|
|
onclick="toggleOffCanvas()"
|
|
class="border px-2 py-1 rounded text-white"
|
|
>
|
|
<svg
|
|
class="h-6 w-6"
|
|
fill="none"
|
|
viewBox="0 0 24 24"
|
|
stroke="currentColor"
|
|
>
|
|
<path
|
|
stroke-linecap="round"
|
|
stroke-linejoin="round"
|
|
stroke-width="2"
|
|
d="M0 6h25M0 12h25M0 18h25"
|
|
/>
|
|
</svg>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div
|
|
id="offCanvas"
|
|
class="fixed top-16 right-0 w-64 h-screen bg-gray-800 transform translate-x-full transition-transform duration-200 ease-in-out"
|
|
>
|
|
<div class="flex flex-col p-4">
|
|
<a
|
|
href="/Blog"
|
|
target="_blank"
|
|
class="text-gray-300 hover:text-white px-3 py-2"
|
|
>Blog</a
|
|
>
|
|
<a
|
|
class="text-gray-300 hover:text-white px-3 py-2 muted"
|
|
title="Under Construction 🚧👷♂️🏗️"
|
|
target="_blank"
|
|
>CV</a
|
|
>
|
|
<a
|
|
href="https://github.com/fedpo2"
|
|
target="_blank"
|
|
class="text-gray-300 hover:text-white px-3 py-2"
|
|
>GitHub</a
|
|
>
|
|
<a
|
|
href="mailto:federico.nicolas.polidoro@gmail.com"
|
|
target="_blank"
|
|
class="text-gray-300 hover:text-white px-3 py-2"
|
|
>Email</a
|
|
>
|
|
<a
|
|
href="https://www.linkedin.com/in/federico-polidoro-40137a25b/"
|
|
target="_blank"
|
|
class="text-gray-300 hover:text-white px-3 py-2"
|
|
>LinkedIn</a
|
|
>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
<script>
|
|
function toggleOffCanvas() {
|
|
const offCanvas = document.getElementById("offCanvas");
|
|
offCanvas.classList.toggle("translate-x-full");
|
|
}
|
|
</script>
|
|
|
|
<div class="pt-16 shadow-md">
|
|
|
|
<div class="flex pt-4 gap-2 md-4 text-center flex-col bg-slate-800 text-white">
|
|
<h1 class="font-bold text-6xl antialiased underline font-sans">Diseño de Software Incident</h1>
|
|
<p class="text-xl font-thin italic">Fecha: 22 Sep 2023</p>
|
|
</div>
|
|
</div>
|
|
<article class=" sm:px-2 md:px-16 lg:px-32">
|
|
<div><h1 id="instanciacion-del-sqlconnection">Instanciacion del SqlConnection</h1>
|
|
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-csharp" data-lang="csharp"><span style="display:flex;"><span><span style="color:#66d9ef">using</span> (<span style="color:#66d9ef">var</span> connection = <span style="color:#66d9ef">new</span> SqlConnection(configuration.GetConnectionString(<span style="color:#e6db74">"DefaultConnection"</span>)))
|
|
</span></span></code></pre></div><p>Eso genera un sql connection que va a existir hasta que salga del scope del programa.</p>
|
|
<h1 id="creacion-del-sqlcommand">Creacion del SqlCommand</h1>
|
|
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-csharp" data-lang="csharp"><span style="display:flex;"><span><span style="color:#66d9ef">using</span> var command = <span style="color:#66d9ef">new</span> SqlCommand();
|
|
</span></span><span style="display:flex;"><span>command.CommandText = <span style="color:#e6db74">"sp_RecuperaProductos"</span>;
|
|
</span></span><span style="display:flex;"><span>command.CommandType = System.Data.CommandType.StoredProcedure;
|
|
</span></span></code></pre></div><h1 id="apertura-de-la-coneccion">Apertura de la coneccion</h1>
|
|
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-csharp" data-lang="csharp"><span style="display:flex;"><span>command.Connection = connection;
|
|
</span></span><span style="display:flex;"><span>command.Connection.Open();
|
|
</span></span></code></pre></div><h2 id="utilizacion-del-executereader">Utilizacion del ExecuteReader</h2>
|
|
<p>Es un choclo pero basicamente el codigo de abajo se encarga de iterar por cada uno de las entradas de la tabla. <strong>MUY</strong> 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).</p>
|
|
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-csharp" data-lang="csharp"><span style="display:flex;"><span><span style="color:#66d9ef">var</span> reader = command.ExecuteReader();
|
|
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">while</span> (reader.Read())<span style="color:#75715e">//lee a traves de todas las filas que existen en la tabla</span>
|
|
</span></span><span style="display:flex;"><span>{
|
|
</span></span><span style="display:flex;"><span> <span style="color:#75715e">//por cada fila que creo tengo que asignar manualmente cada columna con cada propiedad</span>
|
|
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">var</span> producto = <span style="color:#66d9ef">new</span> Producto();
|
|
</span></span><span style="display:flex;"><span> producto.Codigo = reader[<span style="color:#e6db74">"Codigo"</span>].ToString();
|
|
</span></span><span style="display:flex;"><span> producto.Nombre = reader[<span style="color:#e6db74">"Nombre"</span>].ToString();
|
|
</span></span><span style="display:flex;"><span> producto.Cantidad = Convert.ToInt32(reader[<span style="color:#e6db74">"Cantidad"</span>].ToString());
|
|
</span></span><span style="display:flex;"><span> producto.CantidadMinima = Convert.ToInt32(reader[<span style="color:#e6db74">"CantidadMinima"</span>].ToString());
|
|
</span></span><span style="display:flex;"><span> producto.Precio = Convert.ToDecimal(reader[<span style="color:#e6db74">"Precio"</span>].ToString());
|
|
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">var</span> codigoCategoria = reader[<span style="color:#e6db74">"CodigoCategoria"</span>].ToString();
|
|
</span></span><span style="display:flex;"><span> producto.Categoria = RepositorioCategorias.Instancia.RecuperarCategorias().FirstOrDefault(c => c.Codigo == codigoCategoria);
|
|
</span></span><span style="display:flex;"><span> <span style="color:#75715e">//////////////////////////////////////////////////////////////////////////////////////</span>
|
|
</span></span><span style="display:flex;"><span> <span style="color:#75715e">//////////////////////////////////////////////////////////////////////////////////////</span>
|
|
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">using</span> var commandProveedores = <span style="color:#66d9ef">new</span> SqlCommand();
|
|
</span></span><span style="display:flex;"><span> <span style="color:#75715e">//otra forma de hacerlo es usando Store Procedures</span>
|
|
</span></span><span style="display:flex;"><span> commandProveedores.CommandText = <span style="color:#e6db74">"sp_RecuperarProveedoresProducto"</span>;
|
|
</span></span><span style="display:flex;"><span> commandProveedores.CommandType = System.Data.CommandType.StoredProcedure;
|
|
</span></span><span style="display:flex;"><span> commandProveedores.Parameters.Add(<span style="color:#e6db74">"@CodigoProducto"</span>, System.Data.SqlDbType.NVarChar,<span style="color:#ae81ff">25</span>).Value = producto.Codigo;
|
|
</span></span><span style="display:flex;"><span> <span style="color:#75715e">/////////////////////////</span>
|
|
</span></span><span style="display:flex;"><span> commandProveedores.Connection = connection;
|
|
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">var</span> readerProveedoresProducto = command.ExecuteReader();
|
|
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">while</span> (readerProveedoresProducto.Read())<span style="color:#75715e">//lee a traves de todas las filas que existen en la tabla</span>
|
|
</span></span><span style="display:flex;"><span> {
|
|
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">var</span> codigoProveedor = readerProveedoresProducto[<span style="color:#e6db74">"CodigoProveedor"</span>].ToString();
|
|
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">var</span> proveedor = RepositorioProveedores.Instancia.RecuperarProveedores().FirstOrDefault(x => x.Codigo == codigoProveedor);
|
|
</span></span><span style="display:flex;"><span> producto.AgregarProveedor(proveedor);
|
|
</span></span><span style="display:flex;"><span> <span style="color:#75715e">//una vez cargado el objeto completo lo agrego a la coleccion</span>
|
|
</span></span><span style="display:flex;"><span>
|
|
</span></span><span style="display:flex;"><span> }
|
|
</span></span><span style="display:flex;"><span>productos.Add(producto);
|
|
</span></span><span style="display:flex;"><span>}
|
|
</span></span></code></pre></div><h1 id="cerrado-de-la-coneccion">Cerrado de la coneccion</h1>
|
|
<p>NOTA: no ser mamerto y cerrar la coneccion fuera del while-loop.</p>
|
|
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-csharp" data-lang="csharp"><span style="display:flex;"><span>command.Connection.Close();
|
|
</span></span></code></pre></div><h1 id="sub-query">Sub-Query</h1>
|
|
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-csharp" data-lang="csharp"><span style="display:flex;"><span><span style="color:#66d9ef">using</span> var commandProveedores = <span style="color:#66d9ef">new</span> SqlCommand();
|
|
</span></span><span style="display:flex;"><span>
|
|
</span></span><span style="display:flex;"><span>commandProveedores.CommandType = System.Data.CommandType.StoredProcedure;
|
|
</span></span><span style="display:flex;"><span>commandProveedores.CommandText = <span style="color:#e6db74">"SP_AGREGARPROVEEDORPRODUCTO"</span>;
|
|
</span></span><span style="display:flex;"><span>commandProveedores.Connection = connection;
|
|
</span></span><span style="display:flex;"><span>commandProveedores.Transaction = sqlTransaction;
|
|
</span></span><span style="display:flex;"><span>commandProveedores.Parameters.Add(<span style="color:#e6db74">"@CodigoProducto"</span>, System.Data.SqlDbType.NVarChar,<span style="color:#ae81ff">25</span>).Value = producto.Codigo;
|
|
</span></span><span style="display:flex;"><span>commandProveedores.Parameters.Add(<span style="color:#e6db74">"@CodigoProveedor"</span>, System.Data.SqlDbType.NVarChar, <span style="color:#ae81ff">25</span>);
|
|
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">foreach</span> (<span style="color:#66d9ef">var</span> proveedor <span style="color:#66d9ef">in</span> producto.Proveedores)
|
|
</span></span><span style="display:flex;"><span>{
|
|
</span></span><span style="display:flex;"><span> commandProveedores.Parameters[<span style="color:#e6db74">"CodigoProveedor"</span>].Value = proveedor.Codigo;
|
|
</span></span><span style="display:flex;"><span> commandProveedores.ExecuteNonQuery();
|
|
</span></span><span style="display:flex;"><span>}
|
|
</span></span></code></pre></div><h1 id="non-query">Non-Query</h1>
|
|
<p>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.</p>
|
|
<h1 id="notas">Notas</h1>
|
|
<blockquote>
|
|
<p>" Si compila y anda, aprueba " ~Laureano</p></blockquote>
|
|
</div>
|
|
</article>
|
|
|
|
</main>
|
|
<br>
|
|
<footer class="text-center text-sm text-gray-500 mt-12 py-6 border-t">
|
|
© 2025 Federico Polidoro
|
|
</footer>
|
|
</body>
|
|
</html>
|