Files
Blogv3/public/posts/diseño-de-software-incident/index.html
2025-06-18 16:14:17 -03:00

249 lines
15 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-3">
<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="/git"
target="_blank"
class="text-gray-300 hover:text-white px-3 py-2"
>Git</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="/git"
target="_blank"
class="text-gray-300 hover:text-white px-3 py-2"
>Git</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="bg-blue-300 p-12"></div>
<div class="bg-blue-300">
<div class="bg-white rounded-md flex flex-col items-center px-2 py-6 max-w-4xl mx-auto">
<div class="w-full mb-8 overflow-hidden rounded-lg shadow-xl border-4 border-black">
<div class="bg-gray-200 text-gray-600 font-mono text-center py-16">
No image
</div>
</div>
<h1 class="text-4xl font-bold mb-4 text-center">Diseño de Software Incident</h1>
<div class="text-sm text-gray-600 mb-6 font-mono flex gap-4 justify-center">
<span>Publicado el: Sep 22, 2023</span>
<div class="flex gap-2">
<span class="px-2 py-1 bg-gray-200 rounded-full">#old_blog</span>
</div>
</div>
<div class="prose prose-lg max-w-none mb-12">
<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">&#34;DefaultConnection&#34;</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">&#34;sp_RecuperaProductos&#34;</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">&#34;Codigo&#34;</span>].ToString();
</span></span><span style="display:flex;"><span> producto.Nombre = reader[<span style="color:#e6db74">&#34;Nombre&#34;</span>].ToString();
</span></span><span style="display:flex;"><span> producto.Cantidad = Convert.ToInt32(reader[<span style="color:#e6db74">&#34;Cantidad&#34;</span>].ToString());
</span></span><span style="display:flex;"><span> producto.CantidadMinima = Convert.ToInt32(reader[<span style="color:#e6db74">&#34;CantidadMinima&#34;</span>].ToString());
</span></span><span style="display:flex;"><span> producto.Precio = Convert.ToDecimal(reader[<span style="color:#e6db74">&#34;Precio&#34;</span>].ToString());
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">var</span> codigoCategoria = reader[<span style="color:#e6db74">&#34;CodigoCategoria&#34;</span>].ToString();
</span></span><span style="display:flex;"><span> producto.Categoria = RepositorioCategorias.Instancia.RecuperarCategorias().FirstOrDefault(c =&gt; 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">&#34;sp_RecuperarProveedoresProducto&#34;</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">&#34;@CodigoProducto&#34;</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">&#34;CodigoProveedor&#34;</span>].ToString();
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">var</span> proveedor = RepositorioProveedores.Instancia.RecuperarProveedores().FirstOrDefault(x =&gt; 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">&#34;SP_AGREGARPROVEEDORPRODUCTO&#34;</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">&#34;@CodigoProducto&#34;</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">&#34;@CodigoProveedor&#34;</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">&#34;CodigoProveedor&#34;</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>&quot; Si compila y anda, aprueba &quot; ~Laureano</p></blockquote>
</div>
<a
href="/"
class="
inline-block mt-6
border-2 border-black bg-white px-6 py-2
shadow-[0_4px_0_black]
hover:shadow-[0_8px_0_black]
hover:-translate-y-1
transition-all duration-100 ease-linear
font-medium
"
>
← Volver
</a>
</div>
</div>
<div class="bg-blue-300 p-5"></div>
</main>
<br>
<footer class="text-center text-sm text-gray-500 mt-12 py-6 border-t">
© 2025 Federico Polidoro
</footer>
</body>
</html>