<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2spanishfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>SergioTarrillo - RichWeblog</title><link>http://geeks.ms/blogs/sergiotarrillo/default.aspx</link><description>el primer paso es reconocer la adicción, lo acepto soy Geek!</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/sergiotarrillo" type="application/rss+xml" /><feedburner:browserFriendly>Feeds del blog de SergioTarrillo's</feedburner:browserFriendly><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>[WebCast] Pruebas Web y de Carga usando VSTS</title><link>http://feedproxy.google.com/~r/sergiotarrillo/~3/XC02g3gX398/159845.aspx</link><pubDate>Tue, 03 Nov 2009 12:32:06 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:159845</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=159845</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2009/11/03/159845.aspx#comments</comments><description>&lt;p&gt;&lt;img src="http://sergiot2.com/blogimages/2009/11Nov/03-Man-LoadTest.jpg" alt="" /&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;¿Si ponemos un cubo más a esta persona, soportará? ¿o está en su límite (cubo/hombre)?&lt;/li&gt;    &lt;li&gt;¿Cómo supo cuantos cubos soporta? ¿Puso uno por uno hasta sentir dolor en la espalda?&lt;/li&gt;    &lt;li&gt;¿Conoces el límite de tu aplicación Web (Req/s))?&lt;/li&gt;    &lt;li&gt;¿Cómo haces para saber cuántos usuarios soporta tu Aplicación Web? ¿Le pides a 800 amigos de Hi5, a tus 380 amigos del facebook, y a tus 900 amigos de Twitter, que entren todos a la vez?&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Y nada, el día Jueves 05/Nov a las 04:00 p.m. (GMT-05:00), estaremos presentando el siguiente WebCast:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Título Original&lt;/strong&gt;: Webcast MSDN: Prácticas pruebas web&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Descripción&lt;/strong&gt;: En esta sesión se revisa el pasado, presente y futuro de las pruebas Web. Comenzamos al revisar cómo se lograron las pruebas Web antes de la llegada de Team System en Microsoft Visual Studio. A continuación, revisamos las herramientas de pruebas Web y de carga disponibles en Team System 2005/2008 de Visual Studio. Y por último, examinamos el futuro de las pruebas Web y de carga con un vistazo a Team System 2010 de Visual Studio.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Al final del WebCast, trataremos de dar algunas recomendaciones básicas de como detectar el posible origen de un cuello de botella; si está en la aplicación o está en la base de datos.&lt;/p&gt;  &lt;p&gt;Enlace de Registro: &lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032426182&amp;amp;Culture=es-AR"&gt;http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032426182&amp;amp;Culture=es-AR&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Si desean agregar el evento a su calendario, pueden descargar el siguiente archivo: &lt;a title="Webcast MSDN: Prácticas pruebas web" href="http://sergiot2.com/d/WebCast/20091005-WebTesting/20091005-WebCast-WebTests.ics" target="_blank"&gt;WebCast-WebTests.ics&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Saludos,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=159845" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Web/default.aspx">Web</category><enclosure url="http://sergiot2.com/d/WebCast/20091005-WebTesting/20091005-WebCast-WebTests.ics" length="976" type="application/octet-stream" /><feedburner:origLink>http://geeks.ms/blogs/sergiotarrillo/archive/2009/11/03/159845.aspx</feedburner:origLink></item><item><title>WCF Service Configuration Editor y WCF Test Client</title><link>http://feedproxy.google.com/~r/sergiotarrillo/~3/Onj-cO-Lfd0/154990.aspx</link><pubDate>Mon, 31 Aug 2009 01:56:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:154990</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=154990</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2009/08/30/154990.aspx#comments</comments><description>&lt;p&gt;Dos herramientas muy &amp;uacute;tiles durante el desarrollo de Servicios WCF.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;WCF - Microsoft Configuration Services Editor&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Permite configurar el Binding de un Servicio WCF a trav&amp;eacute;s de un &amp;ldquo;Wizard&amp;rdquo;, simple para configurar un servicio b&amp;aacute;sico y aprender de la configuraci&amp;oacute;n que genera en el app.config. Si crean un proyecto del tipo WCF, haciendo clic derecho sobre el archivo de configuraci&amp;oacute;n aparece la opci&amp;oacute;n por defecto, si no es as&amp;iacute; pueden irse a &lt;b&gt;Tools&lt;/b&gt; &amp;ndash;&amp;gt; &lt;b&gt;WCF Service Configuration Editor&lt;/b&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://sergiot2.com/blogimages/2009/08Ago/30_WCF_Microsoft_Services_Configuration.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Referencias:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="WCF Configuration Editor" href="http://jeffbarnes.net/blog/post/2007/02/28/WCF-Configuration-Editor.aspx" target="_blank"&gt;WCF Configuration Editor&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="Edit WCF Configuration context menu missing" href="http://blogs.vertigo.com/personal/petar/Blog/archive/2008/06/25/edit-wcf-configuration-context-menu-missing.aspx" target="_blank"&gt;Edit WCF Configuration context menu missing&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="Workaround for missing &amp;quot;Edit WCF Configuration&amp;quot; menu option in Visual Studio" href="http://www.alexthissen.nl/blogs/main/archive/2008/08/28/workaround-for-missing-quot-edit-wcf-configuration-quot-menu-option.aspx" target="_blank"&gt;Workaround for missing &amp;quot;Edit WCF Configuration&amp;quot; menu option in Visual Studio&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;WCF Test Client&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Esta herramienta permite explorar y probar los m&amp;eacute;todos disponibles en un Servicio WCF, al estilo Web Services en la misma m&amp;aacute;quina y con tipos de datos primitivos. Pero con la diferencia, que no es s&amp;oacute;lo para tipos primitivos, si no para cualquier DataContract definido:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://sergiot2.com/blogimages/2009/08Ago/30_WCF_Test_Client.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Referencias:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="WCF Test Client &amp;ndash; Extended!" href="http://www.larswilhelmsen.com/2008/10/04/wcf-test-client-extended/" target="_blank"&gt;WCF Test Client &amp;ndash; Extended!&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="Using the WCF Development Tools" href="http://msdn.microsoft.com/en-us/library/bb552361.aspx" target="_blank"&gt;Using the WCF Development Tools&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mas detalles sobre herramientas de WCF: &lt;a target="_blank" title="WCF Tools" href="http://geeks.ms/blogs/jlguerrero/archive/2008/01/28/wcf-wcfservicehost-wcftestclient-svcconfigeditor-y-svctraceviewer.aspx"&gt;WCF - WcfServiceHost, WcfTestClient, SvcConfigEditor y SvcTraceViewer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Saludos,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=154990" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/WCF/default.aspx">WCF</category><feedburner:origLink>http://geeks.ms/blogs/sergiotarrillo/archive/2009/08/30/154990.aspx</feedburner:origLink></item><item><title>[Enlace] Ejemplo de uso LINQ y ADO.NET EF con DB2, IDS, U2</title><link>http://feedproxy.google.com/~r/sergiotarrillo/~3/3TnHCnouRMM/153544.aspx</link><pubDate>Tue, 04 Aug 2009 05:41:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:153544</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=153544</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2009/08/04/153544.aspx#comments</comments><description>&lt;p&gt;Buscando referencias sobre ADO.NET EF y DB2 encontr&amp;eacute; este art&amp;iacute;culo-ejemplo, con im&amp;aacute;genes incluidas, de como podemos usar &lt;a href="http://www.ibm.com/developerworks/data/library/techarticle/dm-0903linqentity/" target="_blank"&gt;ADO.NET Entity Framework contra servidores de datos IBM: DB2, Informix Dynamic Server, y U2&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;El resumen del art&amp;iacute;culo traducido (o eso se intento):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;El &amp;ldquo;IBM Data Server Provider for .NET&amp;rdquo; habilita a los desarrolladores tomar ventaja de ADO.NET Entity Framework y LINQ. Puedes desarrollar f&amp;aacute;cilmente el acceso a datos en tus aplicaciones .NET usando cualquier de los servidores de datos IBM (DB2&amp;reg;, Informix&amp;reg; Dynamic Server, o U2), ADO.NET Entity Framework y LINQ. El art&amp;iacute;culo muestra como empezar a usar Entity Framework con un servidor de datos IBM, y te muestra paso a paso, el proceso de como crear una aplicaci&amp;oacute;n desde cero.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Los requerimientos son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="IBM Data Server Driver for ODBC, CLI, and .NET" href="http://www.ibm.com/support/docview.wss?rs=71&amp;amp;uid=swg21288110&amp;amp;S_TACT=105AGX01&amp;amp;S_CMP=LP" target="_blank"&gt;IBM Data Server Driver for ODBC, CLI, and .NET&lt;/a&gt; (version 9.5.3 or later) &lt;/li&gt;
&lt;li&gt;&lt;a title="IBM Database Add-ins for Visual Studio" href="https://www14.software.ibm.com/webapp/iwm/web/preLogin.do?source=swg-vsai&amp;amp;S_TACT=105AGX01&amp;amp;S_CMP=LP" target="_blank"&gt;IBM Database Add-ins for Visual Studio&lt;/a&gt; (version 9.5.3 or later) &lt;/li&gt;
&lt;li&gt;Visual Studio 2008 Service Pack 1 y .NET Framework 3.5 Service Pack 1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Algunas im&amp;aacute;genes del art&amp;iacute;culo:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;Arquitectura       &lt;br /&gt;&lt;/b&gt;&lt;img alt="http://sergiot2.com/blogimages/2009/08Ago/04_Architecture_EntityFramework.gif" src="http://sergiot2.com/blogimages/2009/08Ago/04_Architecture_EntityFramework.gif" /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Los primeros pasos son similares a ADO.NET EF contra SQL&lt;/b&gt;      &lt;br /&gt;&lt;img alt="http://sergiot2.com/blogimages/2009/08Ago/04_Add_New_Item_ADOEF.jpg" src="http://sergiot2.com/blogimages/2009/08Ago/04_Add_New_Item_ADOEF.jpg" /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;La diferencia esta en cambiar el proveedor de la conexi&amp;oacute;n&lt;/b&gt;      &lt;br /&gt;&lt;img alt="http://sergiot2.com/blogimages/2009/08Ago/04_Add_Connection_IBM_Servers.jpg" src="http://sergiot2.com/blogimages/2009/08Ago/04_Add_Connection_IBM_Servers.jpg" /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Los dem&amp;aacute;s es conocido&lt;/b&gt;      &lt;br /&gt;&lt;img alt="http://sergiot2.com/blogimages/2009/08Ago/04_U2_association.jpg" src="http://sergiot2.com/blogimages/2009/08Ago/04_U2_association.jpg" /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Enlace del art&amp;iacute;culo: &lt;a title="Develop a sample application using LINQ programming and the ADO.NET Entity Framework with IBM DB2, IDS, and U2 servers" href="http://www.ibm.com/developerworks/data/library/techarticle/dm-0903linqentity/" target="_blank"&gt;Develop a sample application using LINQ programming and the ADO.NET Entity Framework with IBM DB2, IDS, and U2 servers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;P.D.: Si tiene preguntas sobre el ejemplo pueden enviarlas a los autores del art&amp;iacute;culo &lt;span style="text-decoration:line-through;"&gt;que para eso pusieron sus correos&lt;/span&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.ibm.com/developerworks/data/library/techarticle/dm-0903linqentity/#author1"&gt;Rajan Kumar&lt;/a&gt; (&lt;a href="mailto:rajank@us.ibm.com"&gt;rajank@us.ibm.com&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ibm.com/developerworks/data/library/techarticle/dm-0903linqentity/#author2"&gt;Brent Gross&lt;/a&gt; (&lt;a href="mailto:gross@ca.ibm.com?subject=Develop%20a%20sample%20application%20using%20LINQ%20programming%20and%20the%20ADO.NET%20Entity%20Framework%20with%20IBM%20DB2,%20IDS,%20and%20U2%20servers&amp;amp;cc=gross@ca.ibm.com"&gt;gross@ca.ibm.com&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Saludos,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=153544" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Ado.NET/default.aspx">Ado.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Entity+Framework/default.aspx">Entity Framework</category><feedburner:origLink>http://geeks.ms/blogs/sergiotarrillo/archive/2009/08/04/153544.aspx</feedburner:origLink></item><item><title>[ADO.Net EF] Insercion de registros relacionados</title><link>http://feedproxy.google.com/~r/sergiotarrillo/~3/tKDHtvcN4hI/153460.aspx</link><pubDate>Sat, 01 Aug 2009 18:22:30 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:153460</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>6</slash:comments><wfw:commentRss>http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=153460</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2009/08/01/153460.aspx#comments</comments><description>&lt;p&gt;Una de las operaciones que se puede volver un dolor de cabeza (cuando empezamos a usar EF) es la inserción o actualización de tablas que están relacionadas. Miremos a Northwind:&lt;/p&gt;  &lt;p&gt;&lt;img alt="Entity Framework" src="http://sergiot2.com/blogimages/2009/08Ago/01-EntityFramework.png" /&gt;&lt;/p&gt;  &lt;p&gt;Como se pueden ver si queremos insertar un registro en la tabla Products, necesitamos los CategoryID y SupplierID que están relacionados con otras dos tablas.&lt;/p&gt;  &lt;p&gt;El sentido común te dice que el insertar debería ser algo así:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Int32 InsertarProduct(Products objProd)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt;   Int32 prodId = 0;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (NorthwindEntities edmNorth = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; NorthwindEntities())&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;   {        &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;     edmNorth.AddToProducts(objProd);        &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;     edmNorth.SaveChanges();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;     prodId = objProd.ProductID;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;    }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; prodId;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Y la llamada al método sería la siguiente:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; [TestMethod()]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt;  &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; InsertarProductTest()&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt;  {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt;    RepositoryOrders target = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; RepositoryOrders(); &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;    Products objProd = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Products(); &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;    objProd.ProductName = &lt;span style="color:#006080;"&gt;&amp;quot;My Product 2&amp;quot;&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;    objProd.Suppliers = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Suppliers() { SupplierID = 18 };&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;    objProd.Categories = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Categories() { CategoryID = 1 };          &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;    objProd.QuantityPerUnit = &lt;span style="color:#006080;"&gt;&amp;quot;24 - 50 g pkgs.&amp;quot;&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;    objProd.UnitPrice = 34.45m;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;    objProd.UnitsInStock = 34;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;    objProd.UnitsOnOrder = 3;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt;    objProd.ReorderLevel = 3;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum14"&gt;  14:&lt;/span&gt;    objProd.Discontinued = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum15"&gt;  15:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum16"&gt;  16:&lt;/span&gt;    &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; expected = 0; &lt;span style="color:#008000;"&gt;// TODO: Initialize to an appropriate value&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum17"&gt;  17:&lt;/span&gt;    &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; actual;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum18"&gt;  18:&lt;/span&gt;    actual = target.InsertarProduct(objProd);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum19"&gt;  19:&lt;/span&gt;    Assert.AreNotEqual(expected, actual);     &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum20"&gt;  20:&lt;/span&gt;  }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Pero al ejecutar el código te dará un error como el siguiente: “An error occurred while updating the entries”. Debido a que el EF va intentar actualizar el registro SupplierID y CategoryID, pero el nombre no permite nulos, como estos objetos han sido creados manualmente, EF piensa que quieres actualizar ellos también, cuando sólo quieres insertar un registro de Product.&lt;/p&gt;

&lt;p&gt;Una de las cosas que estaba haciendo era remover las relaciones manualmente (editando el modelo Xml) y el modelo no sabía que estaban relacionadas así que sólo pasaba los datos. Pero actualizar el modelo era una tarea muy trabajosa, y llegas a esos momentos en que dices: “creo que ya es hora, de buscar una forma más simple de hacer esto”.&lt;/p&gt;

&lt;p&gt;En este foro: &lt;a title="How to insert a row using Entity Framework?" href="http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/cde2bb42-8978-4c18-bd52-e56814096881" target="_blank"&gt;How to insert a row using Entity Framework?&lt;/a&gt;, te dan una luz de la solución, y con unos adicionales puede ser así:&lt;/p&gt;

&lt;p&gt;1. Vamos a crear una clase parcial de Product con los campos de relación a las otras tablas. Clase parcial, para que cuando se actualice el modelo esta no se actualice.&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Products&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Int32 SupplierID { get; set; }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Int32 CategoryID { get; set; }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;2. Vamos a cambiar el código de inserción. En el foro, se habla de dos opciones, pero la primera involucra hacer una consulta a la base datos, lo cual no es necesario en una inserción simple, por eso optamos por el segundo.&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Int32 InsertarProduct(Products objProd)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt;    Int32 prodId = 0;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;    &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (NorthwindEntities edmNorth = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; NorthwindEntities())&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;    {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;      objProd.SuppliersReference.EntityKey = &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;              &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; EntityKey(&lt;span style="color:#006080;"&gt;&amp;quot;NorthwindEntities.Suppliers&amp;quot;&lt;/span&gt;,&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;                &lt;span style="color:#006080;"&gt;&amp;quot;SupplierID&amp;quot;&lt;/span&gt;, objProd.SupplierID);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;      objProd.CategoriesReference.EntityKey = &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;              &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; EntityKey(&lt;span style="color:#006080;"&gt;&amp;quot;NorthwindEntities.Categories&amp;quot;&lt;/span&gt;,&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;                &lt;span style="color:#006080;"&gt;&amp;quot;CategoryID&amp;quot;&lt;/span&gt;, objProd.CategoryID);  &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt;      &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum14"&gt;  14:&lt;/span&gt;      edmNorth.AddToProducts(objProd);        &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum15"&gt;  15:&lt;/span&gt;      edmNorth.SaveChanges();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum16"&gt;  16:&lt;/span&gt;      prodId = objProd.ProductID;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum17"&gt;  17:&lt;/span&gt;    }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum18"&gt;  18:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum19"&gt;  19:&lt;/span&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; prodId;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum20"&gt;  20:&lt;/span&gt;  }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;3. Y finalmente la llamada al método será así:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; [TestMethod()]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; InsertarProductTest()&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt;    RepositoryOrders target = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; RepositoryOrders(); &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;    Products objProd = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Products(); &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;    objProd.ProductName = &lt;span style="color:#006080;"&gt;&amp;quot;My Product 2&amp;quot;&lt;/span&gt;;   &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;    &lt;span style="color:#008000;"&gt;//usando clase parcial&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;    objProd.SupplierID = 18;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;    objProd.CategoryID = 1;    &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;    objProd.QuantityPerUnit = &lt;span style="color:#006080;"&gt;&amp;quot;24 - 50 g pkgs.&amp;quot;&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;    objProd.UnitPrice = 34.45m;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;    objProd.UnitsInStock = 34;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt;    objProd.UnitsOnOrder = 3;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum14"&gt;  14:&lt;/span&gt;    objProd.ReorderLevel = 3;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum15"&gt;  15:&lt;/span&gt;    objProd.Discontinued = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum16"&gt;  16:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum17"&gt;  17:&lt;/span&gt;    &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; expected = 0; &lt;span style="color:#008000;"&gt;// TODO: Initialize to an appropriate value&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum18"&gt;  18:&lt;/span&gt;    &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; actual;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum19"&gt;  19:&lt;/span&gt;    actual = target.InsertarProduct(objProd);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum20"&gt;  20:&lt;/span&gt;    Assert.AreNotEqual(expected, actual);     &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum21"&gt;  21:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Se intento pasar los valores en los mismos objetos del modelo, pero hubo algunos errores porque se cruzaba la entidad enviada y la referencia que creamos antes de insertar el producto. Y esto de usar clases parciales, es forma transparente y simple de hacerlo, a propósito si van exponer su modelo en un servicio WCF, tiene que serializar estos atributos de la clase parcial para que también puedan ser expuestos en los contratos.&lt;/p&gt;

&lt;p&gt;Se pudo mostrar otros detalles y los errores de otras pruebas que hice, pero si hacía eso nunca terminaba el artículo, así que mejor enviarlo masticado :D.&lt;/p&gt;

&lt;p&gt;P.D.: Si tienen otras formas de hacer un Insert o Update con tablas relacionadas, lo pueden enviar en los comentarios.&lt;/p&gt;

&lt;p&gt;Saludos,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=153460" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Ado.NET/default.aspx">Ado.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Entity+Framework/default.aspx">Entity Framework</category><feedburner:origLink>http://geeks.ms/blogs/sergiotarrillo/archive/2009/08/01/153460.aspx</feedburner:origLink></item><item><title>lstGeeksMs.Where(u =&gt; u.Estado == "papafeliz").Select(u =&gt; u).ToList().Add(new UserGeek() { Nombre = "sergiotarrillo", Estado = "papafeliz", Hijo = “marcello” });</title><link>http://feedproxy.google.com/~r/sergiotarrillo/~3/erRJX5BFRuI/151035.aspx</link><pubDate>Tue, 23 Jun 2009 07:10:48 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:151035</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>23</slash:comments><wfw:commentRss>http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=151035</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2009/06/23/151035.aspx#comments</comments><description>&lt;a title="Marcelo en el tercer planeta by Sergio Tarrillo, on Flickr" href="http://www.flickr.com/photos/27729679@N02/3652588511/"&gt;&lt;img border="0" alt="Marcelo en el tercer planeta" src="http://farm4.static.flickr.com/3341/3652588511_dd9edc75eb_m.jpg" width="240" height="240" /&gt;&lt;/a&gt;   &lt;p&gt;Pues que nada, me uno a lista de &lt;a href="http://geeks.ms/search/SearchResults.aspx?q=papa" target="_blank"&gt;padres&lt;/a&gt; en &lt;a title="Geeks.ms - Blogs" href="http://geeks.ms/blogs" target="_blank"&gt;Geeks.ms&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Ser papá es un sentimiento difícil de describir con palabras, pero, si ser papá es hablarle a la barriguita de tu esposa durante nueve meses, si ser papá es emocionarte con cada patadita del bebé dentro de la barriguita, si ser papá es llorar junto con el bebé cuando da su primer llanto, si ser papá es ensuciarte con el bebé cuando le cambias los pañales, si ser papá es poner cara de tonto cuando el bebé da su primera sonrisa, si ser papá es contarlo públicamente en tu blog, pues si, que soy un papá feliz!&lt;/p&gt;  &lt;p&gt;Y eso, que es una nueva motivación en la vida para ser una persona mejor.&lt;/p&gt;  &lt;p&gt;Saludos,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=151035" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Varios/default.aspx">Varios</category><feedburner:origLink>http://geeks.ms/blogs/sergiotarrillo/archive/2009/06/23/151035.aspx</feedburner:origLink></item><item><title>Integrando Sistemas de Informacion?</title><link>http://feedproxy.google.com/~r/sergiotarrillo/~3/hRxEfbcQHdU/150245.aspx</link><pubDate>Wed, 10 Jun 2009 03:16:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:150245</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=150245</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2009/06/09/150245.aspx#comments</comments><description>&lt;p&gt;&lt;img src="http://sergiot2.com/blogimages/2009/06Jun/20090609-Integration.jpg" alt="http://sergiot2.com/blogimages/2009/06Jun/20090609-Integration.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;En la mayor&amp;iacute;a de proyectos uno de los retos de alguna u otra forma es intercambiar informaci&amp;oacute;n con sistemas de terceros, a los cuales no tenemos acceso directamente a su fuente de datos. Un caso com&amp;uacute;n es el intercambio de informaci&amp;oacute;n con proveedores, con entidades financieras, entidades p&amp;uacute;blicas, o alguna otro tipo de aplicaci&amp;oacute;n de terceros. Los comentarios a continuaci&amp;oacute;n son basados en los escenarios y proyectos en que participado,&amp;nbsp; y siempre se pueden complementar con alguna experiencia adicional en los comentarios.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;iquest;Por qu&amp;eacute; esta necesidad de intercambiar informaci&amp;oacute;n?&lt;/strong&gt; &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Por que nuestro negocio necesita de otras organizaciones para lograr sus metas. Por ejemplo, si tengo un sitio en la que se realizan ventas on-line, podr&amp;iacute;a crear mi propio medio de pago y encargarme de la cobranza, pero perder&amp;iacute;a la visi&amp;oacute;n de mi negocio: &amp;ldquo;vender&amp;rdquo;, lo que puedo hacer para centrar los esfuerzos en mi negocio, es apoyarme en alg&amp;uacute;n medio de cobro ya existente, pero surge una nueva necesidad: intercambiar informaci&amp;oacute;n con un sistema de cobro. &lt;/li&gt;
&lt;li&gt;Eliminar la redundancia de informaci&amp;oacute;n dentro de nuestra organizaci&amp;oacute;n. La mayor&amp;iacute;a de organizaciones, sobre todo las grandes, cuentan con empaquetados o software com&amp;uacute;nmente llamado ERP. Pero adicionalmente a tener un ERP, tambi&amp;eacute;n podemos contar sistemas propios, ya sea por que el ERP no se adecua en todas las &amp;aacute;reas dentro de mi organizaci&amp;oacute;n, o por que simplemente no hay presupuesto para comprar los otros m&amp;oacute;dulos. Tener varios sistemas en nuestra organizaci&amp;oacute;n, crea la necesidad de poder integrar los mismos, para no tener informaci&amp;oacute;n &amp;ldquo;duplicada&amp;rdquo; en cada sistema, y para remover esa redundancia debemos integrar los sistemas. &lt;/li&gt;
&lt;li&gt;Crear nuevas oportunidades de negocio en nuestra empresa. Digamos que soy una entidad financiera, o soy una empresa que vende electrodom&amp;eacute;sticos, y que deseo como nueva oportunidad de negocio, vender determinados seguros dentro de mi organizaci&amp;oacute;n. Una opci&amp;oacute;n simple y pr&amp;aacute;ctica para hacerlo, es s&amp;oacute;lo vender los seguros y no cubrir los siniestros, para eso debemos buscar una compa&amp;ntilde;&amp;iacute;a de seguros constituida que sea quien cubra los siniestros, y nosotros s&amp;oacute;lo centrarnos en vender seguros a nuestros clientes. Pero para llevar a cabo ello, tenemos el reto, del &amp;aacute;rea de TI, de integrar mi informaci&amp;oacute;n de ventas con la aseguradora. Y este reto tambi&amp;eacute;n es en viceversa, la aseguradora debe tener los mecanismos que me permitan recibir informaci&amp;oacute;n. &lt;/li&gt;
&lt;li&gt;Reportar informaci&amp;oacute;n a sistemas de terceros. Cuando tenemos que reportar informaci&amp;oacute;n, a entidades p&amp;uacute;blicas reguladoras, o a otros sistemas dentro de la corporaci&amp;oacute;n, por ejemplo en el caso que estemos dentro de alguna franquicia. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Y dentro de las opciones de comunicaci&amp;oacute;n tenemos hasta tres escenarios comunes de intercambiar informaci&amp;oacute;n:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Manual. En esta opci&amp;oacute;n hay un esfuerzo del &amp;aacute;rea de TI que va recibir la informaci&amp;oacute;n, ya que debe realizar la aplicaci&amp;oacute;n que usar&amp;aacute;n terceros para ingresar informaci&amp;oacute;n en su fuente de datos. Por ejemplo, una aseguradora no te va dar un conexi&amp;oacute;n directa a su base de datos, una de las opciones que tienen ellos para vender seguros en organizaciones de terceros, es desarrollar una aplicaci&amp;oacute;n que sea usada por todas las empresas quieran vender nuestros seguros. Este escenario tambi&amp;eacute;n es la principal fuente de datos de un ERP, yo puedo consultar y ingresar informaci&amp;oacute;n a una fuente de datos de un ERP, a trav&amp;eacute;s de su aplicaci&amp;oacute;n front-end. &lt;/li&gt;
&lt;li&gt;Masiva. En muchos casos usar el sistema de terceros para enviarles nuestra informaci&amp;oacute;n a su fuente de datos, puede no ser la mejor soluci&amp;oacute;n debido a problemas de infraestructura, de personalizaci&amp;oacute;n, o simplemente por que no hay un front-end, para realizar aquello. Una opci&amp;oacute;n es intercambiar informaci&amp;oacute;n a trav&amp;eacute;s de archivos, digamos que al finalizar el d&amp;iacute;a puedo generar un archivo plano que contiene toda la informaci&amp;oacute;n que deseo ingresar en otra fuente de datos. Esta puede ser la manera m&amp;aacute;s pr&amp;aacute;ctica, r&amp;aacute;pida, f&amp;aacute;cil e interoperable, de intercambiar informaci&amp;oacute;n, ya que todos los sistemas operativos soportan los archivos planos, y todos los lenguajes contienen librer&amp;iacute;as, apis, o clases, para el manejo de archivos, s&amp;oacute;lo basta con definir una estructura y podemos integrar sistemas. Los empaquetados o ERP, normalmente tambi&amp;eacute;n deber&amp;iacute;an permitir carga masiva de informaci&amp;oacute;n a trav&amp;eacute;s de archivos. &lt;/li&gt;
&lt;li&gt;Automatizada o Directa. Una de las &amp;ldquo;desventajas&amp;rdquo; del intercambio de informaci&amp;oacute;n a trav&amp;eacute;s de archivos es que tengo que esperar que estos sean procesados para ver reflejada la informaci&amp;oacute;n en el sistema. Pero tenemos otra opci&amp;oacute;n&amp;nbsp; &amp;ldquo;automatizada&amp;rdquo; de intercambiar informaci&amp;oacute;n &amp;ldquo;on-line&amp;rdquo;, y es que la organizaci&amp;oacute;n que va enviar informaci&amp;oacute;n desarrolle su propio sistema, personalizado con las necesidades del mismo, pero que ingrese directamente informaci&amp;oacute;n en otra fuente de datos, y para lograr este objetivo necesitamos a los famosos &amp;ldquo;conectores&amp;rdquo;, y que cualquier producto empaquetado sea ERP u otro, deber&amp;iacute;a tener, y estos pueden ser conectores limitados (del propio fabricante) o conectores estandarizados, como usar Web Services, y en general cualquier otro &amp;ldquo;Servicio&amp;rdquo; que me permita conectarme con una fuente de datos de terceros. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lo ideal ser&amp;iacute;a que nuestro negocio soporte los tres tipos de comunicaci&amp;oacute;n para no perder ninguna oportunidad de crecimiento: &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Vayamos al escenario de una organizaci&amp;oacute;n que f&amp;aacute;brica determinados productos electr&amp;oacute;nicos. La organizaci&amp;oacute;n, desea aumentar su fuerza de ventas, y para eso tiene pensado elaborar convenios con peque&amp;ntilde;os proveedores que no tienen un &amp;aacute;rea de TI claramente definida, y que no tienen un sistema de ventas implementado, en este escenario se podr&amp;iacute;a dar desarrollar una aplicaci&amp;oacute;n de ventas para los proveedores que quieran vender nuestros productos. &lt;/li&gt;
&lt;li&gt;Pero que pasa si hay otros proveedores, que tienen un &amp;aacute;rea de TI definida, y que cuentan con sistemas propios de ventas, una manera simple de recibir la informaci&amp;oacute;n del proveedor es aceptar la carga masiva a trav&amp;eacute;s de archivos, para ello la organizaci&amp;oacute;n que recibe la informaci&amp;oacute;n debe definir la estructura, y validaci&amp;oacute;n del archivo a intercambiar. &lt;/li&gt;
&lt;li&gt;Y finalmente, si hay un proveedor que desea realizar ventas on-line, debido a que en algunos casos se venden productos sin stock, por el tiempo para enviar y procesar un archivo, pero ellos no quieren usar la aplicaci&amp;oacute;n de ventas del fabricante, por que tendr&amp;iacute;an que duplicar la informaci&amp;oacute;n para que ellos mismos cuenten con la informaci&amp;oacute;n registrada, en cambio el proveedor quieren realizar una aplicaci&amp;oacute;n que registre la venta en su fuente de datos, pero a la vez y de manera autom&amp;aacute;tica que registre la venta en la fuente de datos del fabricante, y ah&amp;iacute; la necesidad de un conector o Web Services, y en general un servicio, para enviar la informaci&amp;oacute;n en tiempo real. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Conocer la visi&amp;oacute;n de negocio o el porque de la necesidad de integrar sistemas, es importante para tener claro proceso y los objetivos de integrar informaci&amp;oacute;n. Ahora vayamos a un punto de vista m&amp;aacute;s t&amp;eacute;cnico, que me permita &amp;ldquo;integrar sistemas&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;En el primer escenario no hay mucha ciencia, ya es algo com&amp;uacute;n y natural desarrollar aplicaciones, s&amp;oacute;lo hay que tener en cuenta que la misma puede ser usada por terceros fuera de mi organizaci&amp;oacute;n. Adem&amp;aacute;s que existen que internet podemos encontrar muchos frameworks de desarrollo, o blogs hablando de tips para el desarrollo de aplicaciones. Por eso nos vamos a centrar en los dos &amp;uacute;ltimos escenarios mencionados.&lt;/p&gt;
&lt;p&gt;Veamos algunos ejemplos:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a target="_blank" href="http://productsearch.spaces.live.com/blog/cns!D789A2CD819EF461!146.entry" title="Windows Live Product Search"&gt;Windows Live Product Search&lt;/a&gt;, o lo que ahora es &lt;a target="_blank" href="http://www.bing.com/shopping" title="Bing Shopping"&gt;Bing Shopping&lt;/a&gt;. Si soy una empresa de venta de productos, este servicio me permite promocionar mis productos, es decir va ser un sistema de apoyo a mi negocio. Live Product Search, ten&amp;iacute;a un servicio para vendedores llamado: &lt;a target="_blank" href="http://productsearch.spaces.live.com/blog/cns!D789A2CD819EF461!148.entry" title="http://productsearch.spaces.live.com/blog/cns!D789A2CD819EF461!148.entry"&gt;Product Upload Service&lt;/a&gt;, este servicio me permit&amp;iacute;a ingresar informaci&amp;oacute;n en su fuente de datos enviando informaci&amp;oacute;n en archivos planos o archivos de texto, delimitados por el car&amp;aacute;cter TAB, un ejemplo ser&amp;iacute;a: &lt;br /&gt;&lt;br /&gt;Product&amp;nbsp;&amp;nbsp; Descripction&amp;nbsp; Price&amp;nbsp; Stock &lt;br /&gt;Prdo01&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Este es un producto muy bueno&amp;nbsp; 34.6&amp;nbsp; 8 &lt;br /&gt;Prdo02&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Este es un producto muy barato&amp;nbsp; 24.6&amp;nbsp; 4 &lt;br /&gt;&lt;br /&gt;S&amp;oacute;lo tengo que enviar mi archivo con todos los productos de mi sistema que deseo publicar, y que ser&amp;aacute;n ingresado en la fuente de datos de ellos, para que ellos puedan promocionarlos en su Web. Google tambi&amp;eacute;n tiene su &lt;a target="_blank" href="http://www.google.com/products" title="Google Product Search"&gt;Google Product Search&lt;/a&gt;, y que tambi&amp;eacute;n soporta el env&amp;iacute;o de &lt;a target="_blank" href="http://base.google.com/support/bin/answer.py?answer=59461&amp;amp;hl=en"&gt;archivos de texto delimitados por TAB&lt;/a&gt;. Adem&amp;aacute;s de archivos planos con separaci&amp;oacute;n por tab, otro formato com&amp;uacute;n son los &lt;a target="_blank" href="http://geeks.ms/blogs/sergiotarrillo/archive/2008/04/15/83113.aspx" title="Leer archivos CSV, Obdc vs Oledb"&gt;archivos CSV&lt;/a&gt;, y hasta se puede intercambiar informaci&amp;oacute;n en archivos usando archivos Excel, pero es 100% recomendable usar archivos de texto, para no limitar el intercambio de informaci&amp;oacute;n a determinadas tecnolog&amp;iacute;as. &lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://www.netsuite.com/portal/home.shtml" title="NetSuite"&gt;NetSuite&lt;/a&gt;. Dentro de una organizaci&amp;oacute;n puedo tener aplicaciones de 3 terceros, para realizar nuestras operaciones transaccionales m&amp;aacute;s importantes, como la contabilidad. Pero a medida que la organizaci&amp;oacute;n sigue creciendo necesita del apoyo de otros negocios o sistemas, y para lograr aquello necesitamos personalizar nuestra comunicaci&amp;oacute;n con el empaquetado o ERP que usemos, en nuestro ejemplo el producto es &lt;a target="_blank" href="http://www.netsuite.com/portal/home.shtml" title="NetSuite"&gt;NetSuite&lt;/a&gt;. Como primera fuente NetSuite nos brinda una aplicaci&amp;oacute;n Web, para ingresar informaci&amp;oacute;n en su fuente de datos. &amp;iquest;Qu&amp;eacute; pasa, si quiero consultar directamente a mi informaci&amp;oacute;n de NetSuite a trav&amp;eacute;s de un sistema?, o &amp;iquest;si quiero manipular la misma?. Digamos que quiero vender mis productos en Amazon, ellos me env&amp;iacute;an diariamente las ordenes de compra y quiero enviar directamente las ordenes a Netsuite, no manualmente a trav&amp;eacute;s de la Web, si no que sea un proceso autom&amp;aacute;tico de un sistema propio. Para lograr aquello, NetSuite posee un juego o api de Web Services llamado &lt;a target="_blank" href="http://www.netsuite.com/portal/developers/resources/suitetalk.shtml" title="NetSuite - SuiteTalk"&gt;SuiteTalk&lt;/a&gt;, con el cual podemos hacer diversas operaciones contra nuestra informaci&amp;oacute;n, consulta o modificaci&amp;oacute;n, directamente, sin la necesidad de que sea un proceso manual a trav&amp;eacute;s de su Front-End. Un caso similar, es con SAP, el cual posee conectores que permite tener acceso a la informaci&amp;oacute;n de un sistema SAP, hay una implementaci&amp;oacute;n para .Net: &lt;a target="_blank" href="http://help.sap.com/saphelp_nw04/Helpdata/EN/e9/23c80d66d08c4c8c044a3ea11ca90f/content.htm" title="SAP .NET Connector"&gt;SAP .NET Connector&lt;/a&gt;, y aqu&amp;iacute; pueden revisar un ejemplo: &lt;a target="_blank" href="http://help.sap.com/saphelp_nw04/Helpdata/EN/51/d5470940fd564b888f4beb9523fa6c/content.htm" title="ASP.NET Using SAP .NET Connector"&gt;ASP.NET Using SAP .NET Connector&lt;/a&gt;. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Notemos, que nosotros no sabemos que motor de base de datos usa Live Products, Google Products, o NetSuite. Pero ello no impide que con un front-end, un archivo masivo, o un conector, pueda consultar y modificar: &amp;ldquo;mi informaci&amp;oacute;n&amp;rdquo;. Y obviamente estos modelos de negocio de poder acceder directamente a mi informaci&amp;oacute;n, tiene que ver con el modelo &lt;a target="_blank" href="http://geeks.ms/blogs/ciin/archive/2007/10/05/software-as-a-service-sas-191-qu-233-es.aspx" title="Software As a Service (SaaS): &amp;iquest;Qu&amp;eacute; es?"&gt;SaaS&lt;/a&gt;, pero ese ser&amp;aacute; tema de otras entradas.&lt;/p&gt;
&lt;p&gt;Resumiendo, si quiero que otras organizaciones se comuniquen o integren con nuestros sistemas, tenemos 3 opciones:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Desarrollar una aplicaci&amp;oacute;n Web o Windows, y que ellos usen la misma para ingresar informaci&amp;oacute;n directamente en nuestra fuente de datos. &lt;/li&gt;
&lt;li&gt;Usar un archivo de carga masiva. Debemos definir: la estructura del archivo, las reglas de validaci&amp;oacute;n, y la frecuencia de env&amp;iacute;o. Y obviamente, soportar la carga masiva a nuestra fuente de datos. &lt;/li&gt;
&lt;li&gt;Crear conectores, que pueden ser Web Services u otro Servicio, que permita que terceros puedan desarrollar sus propias aplicaciones, y se ingrese autom&amp;aacute;ticamente la informaci&amp;oacute;n a nuestra fuente de datos. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tomemos el punto 3 para hacer algunas aclaraciones. Definamos la siguiente frase: &amp;ldquo;Un Web Service no es para que te comuniques tu mismo, un Web Services o Servicio es para habilitar que otro sistemas se comuniquen contigo&amp;rdquo;. Por ejemplo, si en un mismo servidor estar&amp;aacute; la base de datos, el Web Service, y una la Aplicaci&amp;oacute;n Web. Usar un Servicio, Web Services, o WCF para que la aplicaci&amp;oacute;n Web se conecte a la base de datos, &amp;iquest;se justifica la creaci&amp;oacute;n de una capa de servicios para pasar informaci&amp;oacute;n dentro del mismo servidor?, &amp;iquest;sabiendo que ese Servicio s&amp;oacute;lo lo usaremos nosotros?, Nuevamente este es un problema de moda, recomendar el uso de WCF sin conocer el escenario puede ser un problema que finalmente terminan sufriendo los desarrolladores duplicando la comunicaci&amp;oacute;n, cuando no hay un entorno distribuido y cuando nadie m&amp;aacute;s que nosotros va a usar el servicio. Esto no quiere decir que no debamos usar WCF, debemos usarlo pero cuando la infraestructura lo necesite o cuando necesitemos que terceros se comuniquen con nuestra fuente de datos, y no por que en todos lados hablan de Servicios, Web Services, o WCF. Leer tambi&amp;eacute;n este art&amp;iacute;culo de &lt;a target="_blank" href="http://geeks.ms/blogs/elbruno/" title="elBruno - Geeks.ms"&gt;elBruno&lt;/a&gt;: &lt;a target="_blank" href="http://geeks.ms/blogs/elbruno/archive/2008/12/05/evento-user-experience-deepzooming-la-arquitectura-de-la-cebolla-y-las-mesas-redondas.aspx" title="la arquitectura de la cebolla"&gt;la arquitectura de la cebolla&lt;/a&gt;, del mismo podemos acotar la siguiente frase: &amp;ldquo;&lt;em&gt;aplicar la soluci&amp;oacute;n correcta al problema espec&amp;iacute;fico, y que cuando el mismo cambie o evolucione, en ese momento cambiemos o evolucionemos nuestra soluci&amp;oacute;n&lt;/em&gt;&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Y para cerrar, ya mencionamos algunas opciones para poder integrar sistemas, en los siguientes post vamos a desarrollar el uso de intercambio de archivos para carga masiva de informaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Saludos, &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=150245" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Arquitectura/default.aspx">Arquitectura</category><feedburner:origLink>http://geeks.ms/blogs/sergiotarrillo/archive/2009/06/09/150245.aspx</feedburner:origLink></item><item><title>La hora del Planeta: 8.30PM hora local, donde sea que vivas en el planeta Tierra. Sábado 28 de marzo de 2009.</title><link>http://feedproxy.google.com/~r/sergiotarrillo/~3/0R9GS-1pijo/145826.aspx</link><pubDate>Sat, 28 Mar 2009 15:16:54 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:145826</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=145826</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2009/03/28/145826.aspx#comments</comments><description>&lt;p&gt;&lt;img alt="http://sergiot2.com/blogimages/2009/03Mar/2009earthHour.jpg" src="http://sergiot2.com/blogimages/2009/03Mar/2009earthHour.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;Falta un poco más de 8 horas para la Hora del Planeta en Perú (GMT-05:00). En algunos partes del planeta ya iniciaron, pero nosotros todavía estamos a tiempo de prepararnos :d.&lt;/p&gt;  &lt;p&gt;A los que aún no se han enterado, pueden visitar la siguiente página: &lt;a title="http://www.earthhour.org/home/pe:es-419" href="http://www.earthhour.org/home/pe:es-419"&gt;http://www.earthhour.org/home/pe:es-419&lt;/a&gt;. Algunos pesimistas podrían decir que un hora de ahorro no va a detener el cambio climático, la idea no es detener el cambio climático apagando todo lo que pueda consumir energía eléctrica durante una hora, la idea es hacer que la humanidad tome conciencia de que si no cuidamos el planeta las cosas se podrán cada vez peores, hay muchos nevados que están despareciendo, en Perú, acá cerquita en Huaraz, dentro de poco quizás solo haya cerros secos.&lt;/p&gt;  &lt;p&gt;Link: &lt;a title="La hora del planeta: Colabora pe varon, apaga tu foco o te corto el internet" href="http://sergiot2.com/diario/post.aspx?id=e07e13e1-7603-4b86-9f48-1aa837be9e0d" target="_blank"&gt;Reseña peruanaza&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Saludos,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=145826" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Varios/default.aspx">Varios</category><feedburner:origLink>http://geeks.ms/blogs/sergiotarrillo/archive/2009/03/28/145826.aspx</feedburner:origLink></item><item><title>[CodeSnippet] Mostrar un Label en ASP.NET por 3 segundos</title><link>http://feedproxy.google.com/~r/sergiotarrillo/~3/M61Z_AWsHIQ/143172.aspx</link><pubDate>Sat, 21 Feb 2009 06:34:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:143172</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>5</slash:comments><wfw:commentRss>http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=143172</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2009/02/21/143172.aspx#comments</comments><description>&lt;p&gt;&lt;b&gt;Requerimiento&lt;/b&gt;: Despu&amp;eacute;s de procesar una operaci&amp;oacute;n contra la base de datos, se desea mostrar un mensaje de confirmaci&amp;oacute;n en un Label, pero que el mismo desaparezca en unos tres segundos, &lt;a title="Mensaje en label pocos segundos." href="http://foros.solocodigo.com/viewtopic.php?f=49&amp;amp;t=38146" target="_blank"&gt;ver pregunta&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Soluci&amp;oacute;n&lt;/b&gt;: Conociendo el funcionamiento de la &lt;a title="Aplicaciones de Escritorio vs Aplicaciones Web, &amp;iquest;hay diferencia en el desarrollo?" href="http://geeks.ms/blogs/sergiotarrillo/archive/2009/01/14/140214.aspx" target="_blank"&gt;infraestructura web&lt;/a&gt;, el browser es quien autom&amp;aacute;ticamente pasado los 3 segundos debe ocultar el mensaje mostrado. Dado que la funcionalidad que necesitamos es del lado del cliente, la opci&amp;oacute;n es usar &lt;a title="JavaScript" href="http://en.wikipedia.org/wiki/JavaScript" target="_blank"&gt;JavaScript&lt;/a&gt;. Dentro de los &lt;a title="JavaScript Timing Events" href="http://www.w3schools.com/js/js_timing.asp" target="_blank"&gt;eventos Timing de JavaScript&lt;/a&gt;, existe el m&amp;eacute;todo &lt;a title="HTML DOM setTimeout() Method" href="http://www.w3schools.com/htmldom/met_win_settimeout.asp" target="_blank"&gt;setTimeout()&lt;/a&gt; que pertenece al &lt;a title="HTML DOM Window Object" href="http://www.w3schools.com/htmldom/dom_obj_window.asp" target="_blank"&gt;DOM Window&lt;/a&gt;, este m&amp;eacute;todo permite ejecutar una sentencia o funci&amp;oacute;n JavaScript, despu&amp;eacute;s de un determinado tiempo. Y la propuesta ser&amp;aacute; tener dos funciones, una que muestre el &amp;ldquo;Label&amp;rdquo; y que a la vez llame dentro de 3 segundos a otra funci&amp;oacute;n que oculta el Label. Y finalmente para integrarlo con nuestro bot&amp;oacute;n de ASP.NET, al finalizar la ejecuci&amp;oacute;n del mismo podemos registrar el script del lado cliente, usando el m&amp;eacute;todo &lt;a title="ClientScriptManager..::.RegisterStartupScript Method (Type, String, String, Boolean)" href="http://msdn.microsoft.com/en-us/library/z9h4dk8y.aspx" target="_blank"&gt;RegisterStartupScript&lt;/a&gt; de la propiedad &lt;a title="Page.ClientScript" href="http://msdn.microsoft.com/en-us/library/system.web.ui.page.clientscript(VS.80).aspx" target="_blank"&gt;Page.ClientScript&lt;/a&gt;. Nota: no es necesario usar un Label, podemos usar el elemento &lt;a title="HTML &amp;lt;div&amp;gt; tag" href="http://www.w3schools.com/tags/tag_DIV.asp" target="_blank"&gt;HTML Div&lt;/a&gt; para mostrar el mensaje.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;C&amp;oacute;digo ASPX&lt;/b&gt;:&lt;/p&gt;
&lt;div&gt;
&lt;div style="border-style:none;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;head&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;title&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;title&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;script&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;language&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;javascript&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; MostrarLabel() {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;             setTimeout(&lt;span style="color:#006080;"&gt;&amp;quot;OcultarLabel()&amp;quot;&lt;/span&gt;, 3000);&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; msj = document.getElementById(&lt;span style="color:#006080;"&gt;&amp;quot;lblMensaje&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;             msj.style.visibility = &lt;span style="color:#006080;"&gt;&amp;quot;visible&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;         }&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; OcultarLabel() {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; msj = document.getElementById(&lt;span style="color:#006080;"&gt;&amp;quot;lblMensaje&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;             msj.style.visibility = &lt;span style="color:#006080;"&gt;&amp;quot;hidden&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;         }&lt;/pre&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;script&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;head&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;body&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;form&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;id&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;form1&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;div&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;div&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;id&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;lblMensaje&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;style&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;visibility:hidden;&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;           &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;h3&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Mensaje mostrado por tres segundos...&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;h3&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;           &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;br&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;div&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;                &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;input&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;button&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;click aqui&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;onclick&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;MostrarLabel()&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;asp:Button&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ID&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;btnMostrarMensaje&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Text&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Mostrar&amp;quot;&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt;             &lt;span style="color:#ff0000;"&gt;onclick&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;btnMostrarMensaje_Click&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt;          &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;asp:Button&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ID&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;btnNada&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Text&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;No Muestra nada&amp;quot;&lt;/span&gt;  &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;        &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;div&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  17:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;form&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  18:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;body&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;C&amp;oacute;digo Evento&lt;/b&gt;:&lt;/p&gt;
&lt;div&gt;
&lt;div style="border-style:none;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; btnMostrarMensaje_Click(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;   {  &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;//codigo de operaciones contra la base de datos&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;     Page.ClientScript.RegisterStartupScript(&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;        Page.ClientScript.GetType(), &lt;span style="color:#006080;"&gt;&amp;quot;onLoad&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;MostrarLabel();&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;   }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Navegadores Probados:&lt;/b&gt; Todos sobre Windows Vista SP1.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Firefox 3.0.6 &lt;/li&gt;
&lt;li&gt;Internet Explorer 7.0.6001 &lt;/li&gt;
&lt;li&gt;Opera 9.52 &lt;/li&gt;
&lt;li&gt;Google Chrome 1.0.154.48 &lt;/li&gt;
&lt;li&gt;Safari 3.1.2 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Notas&lt;/b&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Art&amp;iacute;culo base: &lt;a title="Show an HTML message box that disappears after 2 seconds" href="http://www.delphifaq.com/faq/javascript/f1055.shtml" target="_blank"&gt;Show an HTML message box that disappears after 2 seconds&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Palabras m&amp;aacute;gicas: &lt;a title="show message seconds JavaScript" href="http://www.google.com/search?q=show+message+seconds+JavaScript&amp;amp;hl=en" target="_blank"&gt;show message seconds JavaScript&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Se pudo mejorar el dise&amp;ntilde;o, con un poco m&amp;aacute;s de HTML + &lt;a title="CSS" href="http://geeks.ms/blogs/sergiotarrillo/search.aspx?q=CSS" target="_blank"&gt;CSS&lt;/a&gt;, la idea es que este art&amp;iacute;culo sea una base para cualquier variaci&amp;oacute;n que ustedes creaci&amp;oacute;n conveniente de acuerdo al requerimiento de su escenario. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Recursos&lt;/b&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="Using JavaScript Along with ASP.NET 2.0" href="http://msdn.microsoft.com/en-us/library/aa479390.aspx" target="_blank"&gt;Using JavaScript Along with ASP.NET 2.0&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;P.D.: Cuando tenga este tipo de requerimientos, no inventen marcianadas para hacerlo con ASP.NET 3.5++, puede ser tan simple de hacerlo con JavaScript. Ojo, tampoco se quiere concluir que todo lo vamos hacer con JavaScript, debemos buscar el equilibrio, sin afectar la seguridad y el rendimiento.&lt;/p&gt;
&lt;p&gt;Saludos,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=143172" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Web/default.aspx">Web</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Code+Snippets/default.aspx">Code Snippets</category><feedburner:origLink>http://geeks.ms/blogs/sergiotarrillo/archive/2009/02/21/143172.aspx</feedburner:origLink></item><item><title>Recomendaciones para la Adopcion de AJAX usando ASP.NET AJAX</title><link>http://feedproxy.google.com/~r/sergiotarrillo/~3/aVdBB0_H4JI/143035.aspx</link><pubDate>Thu, 19 Feb 2009 05:13:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:143035</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=143035</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2009/02/19/143035.aspx#comments</comments><description>&lt;p&gt;&lt;b&gt;Simple&lt;/b&gt;: &amp;ldquo;No usarlo&amp;rdquo;&amp;hellip; (no tomarlo literalmente)&lt;/p&gt;
&lt;p&gt;&lt;img alt="http://sergiot2.com/blogimages/2009/02Feb/18_aspnet_ajax_logo.png" src="http://sergiot2.com/blogimages/2009/02Feb/18_aspnet_ajax_logo.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Repasando&lt;/b&gt;: Como ya hemos comentado, &lt;a title="Aplicaciones de Escritorio vs Aplicaciones Web, &amp;iquest;hay diferencia en el desarrollo?" href="http://geeks.ms/blogs/sergiotarrillo/archive/2009/01/14/140214.aspx" target="_blank"&gt;la infraestructura que da soporte a las aplicaciones Web&lt;/a&gt; es diferente a una aplicaci&amp;oacute;n de escritorio. Si bien esta infraestructura es rica en acceso (acceder desde cualquier parte del mundo con una conexi&amp;oacute;n a Internet), tambi&amp;eacute;n tiene desventajas y una de ellas son los &amp;ldquo;viajes&amp;rdquo; que tienen que hacer al servidor Web. Si bien en el navegador estamos viendo una r&amp;eacute;plica de la informaci&amp;oacute;n (en formato html), si queremos refrescar la informaci&amp;oacute;n o hacer alguna operaci&amp;oacute;n, nuestro pedido (request) viaja desde nuestra PC hasta el servidor Web, que puede estar al otro lado del mundo, pero gracias al protocolo &lt;a title="Hypertext Transfer Protocol (HTTP)" href="http://en.wikipedia.org/wiki/Http" target="_blank"&gt;HTTP&lt;/a&gt; se pueden comunicar. Y cada vez que hacemos un request al servidor, tenemos que esperar que se refresque nuevamente toda la p&amp;aacute;gina (algunos navegadores usan Cache para los estilos y dise&amp;ntilde;o) lo que da una apariencia de cargar m&amp;aacute;s r&amp;aacute;pido. De ah&amp;iacute; la siguiente necesidad de las aplicaciones Web, despu&amp;eacute;s de quedar la satisfecha la necesidad de que sean din&amp;aacute;micas (tecnolog&amp;iacute;as de servidor, asp, php, jsp, etc), es la necesidad de mejorar la experiencia de usuario de las aplicaciones Web, y que puedan ser semejantes al estilo de una aplicaci&amp;oacute;n de escritorio, &lt;a title="ASP.NET AJAX, haciendo historia" href="http://blogs.3devnet.com/blogs/guino/archive/2007/03/11/14687.aspx" target="_blank"&gt;han habido muchos intentos&lt;/a&gt; &lt;a title="iframe o AJAX?" href="http://geeks.ms/blogs/sergiotarrillo/archive/2007/06/25/16509.aspx" target="_blank"&gt;por establecer&lt;/a&gt; la tecnolog&amp;iacute;a que permitir&amp;iacute;a mejorar la experiencia de usuario de una Aplicaci&amp;oacute;n Web, todos ten&amp;iacute;an que ver con el complemento del lado del cliente para lograr esto. Pero en los &amp;uacute;ltimos a&amp;ntilde;os, los esfuerzos han estado centrados en &lt;a title="Ajax" href="http://geeks.ms/blogs/sergiotarrillo/search.aspx?q=Ajax" target="_blank"&gt;AJAX&lt;/a&gt;, y en las aplicaciones &lt;a title="Rich Internet application" href="http://geeks.ms/search/SearchResults.aspx?q=RIA" target="_blank"&gt;RIA&lt;/a&gt;, considerando a estas &amp;uacute;ltimas como producto: Silverlight y Flash, por que las aplicaciones AJAX tambi&amp;eacute;n hacen una aplicaci&amp;oacute;n RIA.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Frameworks AJAX&lt;/b&gt;: Implementar AJAX usando directamente el objeto &lt;a title="XMLHttpRequest" href="http://es.wikipedia.org/wiki/XMLHttpRequest" target="_blank"&gt;XMLHttpRequest&lt;/a&gt;, puede llevarnos a escribir c&amp;oacute;digo m&amp;aacute;s limpio y m&amp;aacute;s &amp;oacute;ptimo, pero el esfuerzo y tiempo invertido para lograr grandes cosas, puede ser muy alto (dependiendo del escenario). Y es por eso que existen los frameworks AJAX, para todos los gustos, sabores, y colores. Aqu&amp;iacute; hay &lt;a title="List of Ajax frameworks" href="http://en.wikipedia.org/wiki/List_of_Ajax_frameworks" target="_blank"&gt;una lista&lt;/a&gt; de un &lt;a title="The Most Complete AJAX Framework and JavaScript Libraries List(124+)" href="http://ntt.cc/2008/02/13/the-most-complete-ajax-framework-and-javascript-libraries-list.html" target="_blank"&gt;mont&amp;oacute;n de Frameworks Ajax&lt;/a&gt;, tambi&amp;eacute;n pueden verlos &lt;a title="AJAXFrameworks" href="http://ajaxpatterns.org/wiki/index.php?title=AJAXFrameworks" target="_blank"&gt;agrupados por lenguaje&lt;/a&gt;. Microsoft, tambi&amp;eacute;n liber&amp;oacute; para los desarrolladores .NET (y no .Net) un Framework AJAX llamado &lt;a title="ASP.NET AJAX" href="http://www.asp.net/ajax/" target="_blank"&gt;ASP.NET AJAX&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;ASP.NET AJAX&lt;/b&gt;, tiene dos componentes: Microsoft Ajax Library (que podr&amp;iacute;a ser usado con PHP, &lt;a title="Webcast: Usando Microsoft AJAX Library con PHP" href="http://geeks.ms/blogs/sergiotarrillo/archive/2007/03/06/11352.aspx" target="_blank"&gt;ver WebCast&lt;/a&gt;), y otro componente del lado del servidor llamado ASP.NET AJAX Extensions, y que es netamente para integrarse con el Page Framework de ASP.NET 2.0+ (VS2005/VS2008), pueden ver m&amp;aacute;s detalles de la arquitectura de ASP.NET AJAX en el &lt;a title="ASP.NET AJAX Overview" href="http://www.asp.net/ajax/documentation/live/overview/default.aspx" target="_blank"&gt;siguiente art&amp;iacute;culo&lt;/a&gt;. ASP.NET AJAX, puede ser una soluci&amp;oacute;n m&amp;aacute;gica, por que r&amp;aacute;pidamente podemos tener nuestras aplicaciones Web, usando AJAX con s&amp;oacute;lo arrastrar el control &lt;a title="UpdatePanel on Geeks.ms" href="http://geeks.ms/search/SearchResults.aspx?q=UpdatePanel" target="_blank"&gt;UpdatePanel&lt;/a&gt;, podemos tener implementando AJAX en aplicaciones existentes, &lt;a title="ya pueden descargar el webCast de ASP.NET AJAX" href="http://geeks.ms/blogs/sergiotarrillo/archive/2007/06/05/15631.aspx" target="_blank"&gt;ver WebCast&lt;/a&gt;. Si tienen un mantenedor con una barra de botones, un GridView para mostrar la lista, y un FormView para las dem&amp;aacute;s operaciones, bastar&amp;iacute;a colocar los 3 controles dentro de un UpdatePanel cada uno, y m&amp;aacute;gicamente ya tenemos implementado AJAX dentro de nuestra aplicaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Problema de la Magia&lt;/b&gt;, como todo producto m&amp;aacute;gico, tiene sus costos por detr&amp;aacute;s. Aunque ASP.NET AJAX maneja postbacks as&amp;iacute;ncronos con el servidor Web, la informaci&amp;oacute;n que viaja entre cliente y servidor no es la m&amp;aacute;s &amp;oacute;ptima, hombre que la magia tiene su coste. Y esto debido a que si no hacemos una buena administraci&amp;oacute;n del ViewState, este estar&amp;aacute; viajando entre los postbacks as&amp;iacute;ncronos, revisar &lt;a title="Why ASP.NET AJAX UpdatePanels are dangerous" href="http://encosia.com/2007/07/11/why-aspnet-ajax-updatepanels-are-dangerous/" target="_blank"&gt;este art&amp;iacute;culo&lt;/a&gt; para ver un ejemplo. Adem&amp;aacute;s de que ASP.NET AJAX es un framework centrado en el Servidor viaja informaci&amp;oacute;n+dise&amp;ntilde;o entre postbacks as&amp;iacute;ncronos, a diferencia de un framework centrado en el cliente, que s&amp;oacute;lo viaja datos entre cliente y servidor, pero hay que &amp;ldquo;actualizar el dise&amp;ntilde;o&amp;rdquo; manualmente usando &lt;a title="JavaScript" href="http://en.wikipedia.org/wiki/JavaScript" target="_blank"&gt;JavaScript&lt;/a&gt; y &lt;a title="Document Object Model" href="http://en.wikipedia.org/wiki/Document_Object_Model" target="_blank"&gt;DOM&lt;/a&gt;. &lt;a title="Welcome to my comparison of AJAX frameworks for ASP.NET" href="http://www.daniel-zeiss.de/AJAXComparison/Results.htm" target="_blank"&gt;Este art&amp;iacute;culo&lt;/a&gt; tiene resultados muy interesantes en cuanto a comparaci&amp;oacute;n de frameworks de AJAX para ASP.NET.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Alternativa&lt;/b&gt;, Una alternativa dentro de ASP.NET AJAX es usar los &lt;a title="PageMethods on Geeks.ms" href="http://geeks.ms/search/SearchResults.aspx?q=PageMethods" target="_blank"&gt;PageMethods&lt;/a&gt;, para que desde JavaScript podamos llamar a los mismos, o tambi&amp;eacute;n llamar desde JavaScript a Web Services. Con esto garantizamos la transferencia s&amp;oacute;lo de informaci&amp;oacute;n, y el dise&amp;ntilde;o hay que modificarlo con JavaScript. Revisar este ejemplo de &lt;a title="ASP.NET AJAX UpdatePanel vs ASP.NET PageMethod" href="http://geeks.ms/blogs/dsalgado/archive/2008/05/05/asp-net-ajax-updatepanel-vs-asp-net-pagemethod.aspx" target="_blank"&gt;JavaScript y PageMethods&lt;/a&gt;, y &lt;a title="Acceder a PageMethods con jQuery" href="http://geeks.ms/blogs/jmaguilar/archive/2008/06/02/acceder-a-pagemethods-con-jquery.aspx" target="_blank"&gt;JQuery y PageMethods&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Recomendaciones&lt;/b&gt;, se que fue mucho floro para llegar a las recomendaciones, pero fue necesario. Si cociendo la &amp;ldquo;magia&amp;rdquo; que hay detr&amp;aacute;s de ASP.NET AJAX, hemos decidido usarlo, por que la aplicaci&amp;oacute;n no requiere un alto rendimiento, s&amp;oacute;lo estar&amp;aacute; disponible dentro de nuestra empresa (y no a toda la internet, &amp;oacute;sea cantidad de usuarios limitada), o hemos visto que en el prototipo, los resultados son aceptables. Hay algunas recomendaciones b&amp;aacute;sicas para usar ASP.NET AJAX:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span style="text-decoration:underline;"&gt;No usarlo&lt;/span&gt;. No usarlo hasta que la p&amp;aacute;gina web este funcionando al 100%. La magia de ASP.NET AJAX, a trav&amp;eacute;s del &lt;a title="UpdatePanel on Geeks.ms" href="http://geeks.ms/search/SearchResults.aspx?q=UpdatePanel" target="_blank"&gt;UpdatePanel&lt;/a&gt;, permite que luego de que la p&amp;aacute;gina este funcionando, arrastramos al control UpdatePanel, colocamos nuestros controles de ASP.NET dentro del UpdatePanel, y nuestra p&amp;aacute;gina aspx ya tiene AJAX, con s&amp;oacute;lo arrastrar un control, en &lt;a title="Implementando ASP.NET AJAX en aplicaciones Web Existentes" href="http://geeks.ms/blogs/sergiotarrillo/archive/2007/06/05/15631.aspx" target="_blank"&gt;este WebCast&lt;/a&gt;, se muestra como a una &lt;a title="The Classifieds Site Starter Kit" href="http://www.asp.net/downloads/starter-kits/classifieds/" target="_blank"&gt;aplicaci&amp;oacute;n Web existente&lt;/a&gt; (de otro autor), la implementaci&amp;oacute;n de ASP.NET AJAX usando el UpdtePanel fue sencilla y no requiri&amp;oacute; cambiar el modelo de programaci&amp;oacute;n. La recomendaci&amp;oacute;n, que motiva a no usar ASP.NET AJAX hasta que la p&amp;aacute;gina este funcionando, es debido a que muchas veces suele confundirse los errores, y no se sabe si la p&amp;aacute;gina no funciona por que el UpdatePanel tiene un bug, o los otros controles que estamos usando tiene bug, y raras veces se piensa que el c&amp;oacute;digo que hemos hecho es el que tiene el bug. Por eso, si nos centramos principalmente en hacer funcionar la p&amp;aacute;gina al inicio, el rango de causas de errores disminuir&amp;aacute; por que no incluye los que pueda producir el uso de ASP.NET AJAX, lo que har&amp;aacute; m&amp;aacute;s f&amp;aacute;cil identificarlos, y solucionarlos, y esto sobretodo para procesos complejos, que tienen que implementarse. En los proyectos participado o en las consultor&amp;iacute;as y mentoring que hemos impartido con 3Dev, este era un problema frecuente, se tiende a responsabilizar al UpdatePanel de cualquier error que suceda en la p&amp;aacute;gina, y siempre hay que hacerse esta pregunta: &amp;ndash;la p&amp;aacute;gina funciona correctamente sin el UpdatePanel?, y despu&amp;eacute;s de remover el UpdatePanel queda claro cual es el origen del error. Un amigo (Luis B.), en tono jocoso, quer&amp;iacute;a demandar a Bill Gates por que ASP.NET Ajax no funcionaba, despu&amp;eacute;s de remover el UpdatePanel ya no dijo nada :D. &lt;/li&gt;
&lt;li&gt;El UpdatePanel no es &lt;span style="text-decoration:underline;"&gt;barita m&amp;aacute;gica&lt;/span&gt;. Si bien es tan sencillo agregar AJAX a nuestras aplicaciones Web usando el control UpdatePanel, tampoco se debe hacer un uso indiscriminado del mismo. Por ejemplo, dentro de un formulario Web, s&amp;oacute;lo agregar a los controles que se van actualizar dentro de un UpdatePanel, en una p&amp;aacute;gina de mantenimiento s&amp;oacute;lo a los controles principales como un control GridView, formView, y al men&amp;uacute;, pero no a toda la p&amp;aacute;gina, la idea de AJAX es actualizar la p&amp;aacute;gina as&amp;iacute;ncronamente para tener una mejor experiencia del usuario, pero si vamos a actualizar toda la p&amp;aacute;gina no tiene sentido. Una forma de evitar tener que usar un control UpdatePanel en todo, es usar &lt;b&gt;AsyncPosBackTrigger&lt;/b&gt; en un UpdatePanel, &lt;a title="usando ASP.NET AJAX, pero no abusando" href="http://geeks.ms/blogs/sergiotarrillo/archive/2007/02/10/10199.aspx" target="_blank"&gt;un ejemplo&lt;/a&gt;, con esto evitamos colocar todos los controles en UpdatePanels. Recuerden que un UpdatePanel se actualiza, cuando un control dentro del mismo produce un PostBack, entonces se actualiza el UpdatePanel y se produce un PostBack as&amp;iacute;ncrono, o tambi&amp;eacute;n se actualiza cuando otro UpdatePanel se actualiza, es decir, que si una p&amp;aacute;gina tenemos tres UpdatePanels que no est&amp;aacute;n relacionados, si actualizo uno de ellos autom&amp;aacute;ticamente se actualizan los otros dos. Para solucionar este &amp;uacute;ltimo problema, se puede actualizar el UpdatePanel manual, es decir program&amp;aacute;ticamente, &lt;a title="Updating an UpdatePanel Programmatically in C#" href="http://www.ajaxtutorials.com/ajax-tutorials/updating-an-updatepanel-programmatically-in-c/" target="_blank"&gt;un ejemplo&lt;/a&gt;, aunque esta un poco simple el &amp;uacute;ltimo ejemplo un posible escenario es si es que dentro de una p&amp;aacute;gina aspx, tengo 3 UpdatePanels, y s&amp;oacute;lo voy actualizar dos, la forma correcta es asignar a la propiedad UpdateMode el valor de Conditional, as&amp;iacute; solo se actualizar&amp;aacute;n cuando se produzca un evento dentro de ellos, o cuando se llame expl&amp;iacute;citamente al m&amp;eacute;todo Update del control UpdatePanel. &lt;/li&gt;
&lt;li&gt;Cuidado con el &lt;span style="text-decoration:underline;"&gt;dedo compulsivo&lt;/span&gt;. Uno de los detalles de usar AJAX, son que cuando se produce un postback as&amp;iacute;ncrono el usuario (ni el mismo desarrollador) sabe si se ejecuto o no el evento, y entonces vuelven hacer varios clic en el bot&amp;oacute;n para asegurarse que hicieron clic. Es por eso que es necesario &lt;a title="indicadores y los patrones para AJAX" href="http://geeks.ms/blogs/sergiotarrillo/archive/2007/03/22/12137.aspx" target="_blank"&gt;usar indicadores&lt;/a&gt; para indicarle al usuario, que su pedido se esta procesando, con ASP.NET AJAX pueden usar el control &lt;a title="UpdateProgress on Geeks.ms" href="http://geeks.ms/search/SearchResults.aspx?q=UpdateProgress" target="_blank"&gt;UpdateProgress&lt;/a&gt;, pero mucho mejor si lo &lt;a title="Centrar UpdateProgress en un UpdatePanel ( JQuery )" href="http://geeks.ms/blogs/mrubino/archive/2008/10/06/centrar-updateprogress-en-un-updatepanel-jquery.aspx" target="_blank"&gt;hacen centrado&lt;/a&gt; y &lt;a title="ASP.NET Ajax: Utilizando el control ModalPopupExtender como una ventana Splash" href="http://geeks.ms/blogs/imostacero/archive/2006/10/18/ASP.NET-Ajax_3A00_-Utilizando-el-control-ModulPopupExtender-como-una-barra-de-Progreso_2E00_.aspx" target="_blank"&gt;bloquean la pantalla&lt;/a&gt;. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;b&gt;AjaxControlToolkit (ACT)&lt;/b&gt;, un juego de controles (ajaxcontroltoolkit.dll) liberados junto con ASP.NET AJAX, hay algunos controles &amp;uacute;tiles como el control AutoComplete, y bueno otros que se podr&amp;iacute;an mejorar. Y al igual que ASP.NET AJAX, hay que &lt;a title="Atlas Control Toolkit, &amp;iquest;javascript f&amp;aacute;cil = javascript pesado?" href="http://www.buayacorp.com/archivos/atlas-control-toolkit-%C2%BFjavascript-facil-javascript-pesado/" target="_blank"&gt;tener cuidado con el uso del ACT&lt;/a&gt;, evaluarlo en nuestros escenarios. &lt;a title="ASP.NET AJAX Control Toolkit" href="http://www.asp.net/ajax/ajaxcontroltoolkit/samples/" target="_blank"&gt;Aqu&amp;iacute;&lt;/a&gt; pueden ver los ejemplos de los controles Online, y en algunos controles se aplican la misma regla que el UpdatePanel, primero verifiquen el funcionamiento b&amp;aacute;sico de su p&amp;aacute;gina, antes de usar algunos controles del ACT. Ejemplos del ACT, los pueden descargar de &lt;a title="Welcome to the AJAX Control Toolkit!" href="http://www.codeplex.com/AjaxControlToolkit" target="_blank"&gt;la p&amp;aacute;gina del mismo en CodePlex&lt;/a&gt;, adem&amp;aacute;s de los ejemplos se encuentra el c&amp;oacute;digo fuente del ACT. Nota: los ejemplos son los mismo que est&amp;aacute;n online, y todos los controles tienen un ejemplo, lo pendiente es revisar que &lt;a title="CSS" href="http://geeks.ms/blogs/sergiotarrillo/search.aspx?q=CSS" target="_blank"&gt;CSS&lt;/a&gt; usa el control que vamos a probar, y eso copiarlo a nuestro sitio Web.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Destacado&lt;/b&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="ASP.NET AJAX: posibilidades y escenarios de uso" href="http://geeks.ms/blogs/jfortes/archive/2008/10/29/ASP.NET-AJAX_3A00_-posibilidades-y-escenarios-de-uso.aspx" target="_blank"&gt;ASP.NET AJAX: posibilidades y escenarios de uso&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="Evento online ASP.NET AJAX y JQuery SecondNug" href="http://geeks.ms/blogs/mrubino/archive/2008/10/28/evento-online-asp-net-ajax-y-jquery-secondnug.aspx" target="_blank"&gt;Evento online ASP.NET AJAX y JQuery SecondNug&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="UpdatePanel Tips and Tricks" href="http://msdn.microsoft.com/en-us/magazine/cc163413.aspx" target="_blank"&gt;UpdatePanel Tips and Tricks&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="Flan AJAX Controls" href="http://www40.brinkster.com/rajbk/FlanControls.html" target="_blank"&gt;Flan AJAX Controls&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="ASP.NET AJAX on Geeks.ms" href="http://geeks.ms/search/SearchResults.aspx?q=ASP.NET+AJAX" target="_blank"&gt;ASP.NET AJAX on Geeks.ms&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="UpdatePanel on Geeks.ms" href="http://geeks.ms/search/SearchResults.aspx?q=UpdatePanel" target="_blank"&gt;UpdatePanel on Geeks.ms&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Art&amp;iacute;culos, Videos, Ejemplos:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="ASP.NET Ajax Tutorials" href="http://www.asp.net/learn/ajax/" target="_blank"&gt;ASP.NET Ajax Tutorials&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="ASP.NET AJAX Videos" href="http://www.asp.net/learn/ajax-videos/" target="_blank"&gt;ASP.NET AJAX Videos&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="ASP.NET AJAX Control Toolkit" href="http://www.asp.net/Ajax/ajaxcontroltoolkit/" target="_blank"&gt;ASP.NET AJAX Control Toolkit&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Saludos,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=143035" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/ASP.NET+AJAX/default.aspx">ASP.NET AJAX</category><feedburner:origLink>http://geeks.ms/blogs/sergiotarrillo/archive/2009/02/19/143035.aspx</feedburner:origLink></item><item><title>Buenas practicas de programacion y tecnicas para liberar recursos, para tener una aplicacion mas rapida ¿?</title><link>http://feedproxy.google.com/~r/sergiotarrillo/~3/ttQW1h9WuPg/142102.aspx</link><pubDate>Fri, 06 Feb 2009 07:46:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:142102</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>6</slash:comments><wfw:commentRss>http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=142102</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2009/02/06/142102.aspx#comments</comments><description>&lt;p&gt;&lt;img alt="http://sergiot2.com/blogimages/2009/02Feb/06-Tortuga-Lenta-o-Liebre-Rapida.jpg" src="http://sergiot2.com/blogimages/2009/02Feb/06-Tortuga-Lenta-o-Liebre-Rapida.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;iquest;La aplicaci&amp;oacute;n web de Geeks.ms es &lt;span style="text-decoration:underline;"&gt;r&amp;aacute;pida&lt;/span&gt;?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;iquest;R&amp;aacute;pida, para qui&amp;eacute;n?. Para el programador?, para el usuario?, o para el jefe de proyectos?. &amp;iquest;Cu&amp;aacute;ntos segundos debe tomar cargar una aplicaci&amp;oacute;n para que sea r&amp;aacute;pida? &amp;ndash;4 segundos, 8 segundos, 15 segundos?&lt;/p&gt;
&lt;p&gt;Y las mismas preguntas podemos hacernos, para considerar una aplicaci&amp;oacute;n lenta.&lt;/p&gt;
&lt;p&gt;Antes de jugar al &lt;a title="El rendimiento, la percepci&amp;oacute;n y el tel&amp;eacute;fono escacharrado..." href="http://geeks.ms/blogs/rcorral/archive/2008/10/20/el-rendimiento-la-percepci-243-n-y-el-tel-233-fono-escacharrado.aspx" target="_blank"&gt;tel&amp;eacute;fono malogrado&lt;/a&gt;, se deber&amp;iacute;a tener un l&amp;iacute;mite para considerar a una aplicaci&amp;oacute;n &amp;ldquo;lenta&amp;rdquo;. Si dentro de los &lt;a title="requerimientos no funcionales" href="http://es.wikipedia.org/wiki/Requerimiento_no_funcional" target="_blank"&gt;requerimientos no funcionales&lt;/a&gt;, se dice que ning&amp;uacute;n formulario debe tomar m&amp;aacute;s de 15 segundos para completar una operaci&amp;oacute;n, ya se sabe que si p&amp;aacute;gina o formulario toma 20 segundos, se podr&amp;iacute;a decir que es lenta. Entonces, para poder definir si una aplicaci&amp;oacute;n es lenta o es r&amp;aacute;pida, el l&amp;iacute;mite deber&amp;iacute;a estar definido en los requerimientos no funcionales, y si no lo esta (en muchos casos), antes de optimizar se deber&amp;iacute;a especificar cual ser&amp;aacute; el tiempo de referencia a tomar, para considerar a una aplicaci&amp;oacute;n r&amp;aacute;pida o lenta. As&amp;iacute; cuando llegue alguna queja del usuario por que quiere una aplicaci&amp;oacute;n sea m&amp;aacute;s r&amp;aacute;pida, se revisa si el formulario esta dentro de los l&amp;iacute;mites, y si a&amp;uacute;n as&amp;iacute; el usuario quiere m&amp;aacute;s r&amp;aacute;pida (nuevos l&amp;iacute;mites) ese es otro precio.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;iquest;Todas los formularios requieren optimizaci&amp;oacute;n?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Normalmente los procesos de mantenimiento, deber&amp;iacute;a ser los m&amp;aacute;s r&amp;aacute;pidos (usamos el t&amp;eacute;rmino r&amp;aacute;pido como comparaci&amp;oacute;n no como medida) a comparaci&amp;oacute;n de los procesos de b&amp;uacute;squedas, cargas masivas, o exportar informaci&amp;oacute;n o procesos de fin de mes.&lt;/p&gt;
&lt;p&gt;Veamos, si una p&amp;aacute;gina de mantenimiento s&amp;oacute;lo requiere hacer operaciones de consulta (muchos registros), inserci&amp;oacute;n (un registro), actualizaci&amp;oacute;n (un registro), y eliminaci&amp;oacute;n (un registro), no deber&amp;iacute;a tomar m&amp;aacute;s tiempo que otras p&amp;aacute;ginas de procesos m&amp;aacute;s complejos. Y para lograr esto debemos tener algunos detalles en cuenta, que son b&amp;aacute;sicos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Administrar correctamente las conexiones a la base de datos, liberar los recursos despu&amp;eacute;s de usarlos. Desde .Net, podemos usar la clausula using, para asegurarnos de liberar los recursos. Revisar esta entrada: &lt;a title="ADO.NET: tu conexion no se cierra?, el poder de using" href="http://geeks.ms/blogs/sergiotarrillo/archive/2008/01/17/64538.aspx" target="_blank"&gt;Ado.Net y Using&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt;Paginar los resultados desde la base de datos, y no desde el cliente. Hay algunos controles m&amp;aacute;gicos que ofrecen, paginaci&amp;oacute;n, pero a qu&amp;eacute; costo?. Por ejemplo para paginar en Oracle podemos usar &lt;a title="Paging Oracle Results" href="http://www.blahstuff.com/oldstuff/2005/12/08/363/paging-oracle-results/" target="_blank"&gt;ROWNUM&lt;/a&gt;, y en SQL Server podemos usar &lt;a title="Paging Records Using SQL Server 2005 Database - ROW_NUMBER Function" href="http://www.davidhayden.com/blog/dave/archive/2005/12/30/2652.aspx" target="_blank"&gt;ROW_NUMBER&lt;/a&gt;, obviamente que para lograr una paginaci&amp;oacute;n del lado de cliente, involucra que tengamos que pasarle dos par&amp;aacute;metros m&amp;aacute;s como el registro inicial (startRowIndex) y la cantidad de resultados (maximumRows), adem&amp;aacute;s de que tengamos que hacer otro m&amp;eacute;todo y procedure, para &amp;ldquo;contar&amp;rdquo;, ya que necesitamos saber cuantas p&amp;aacute;ginas tiene el resultado. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si seguimos estas dos reglas b&amp;aacute;sicas, los formularios de mantenimiento deben ser los m&amp;aacute;s r&amp;aacute;pidas de toda nuestra aplicaci&amp;oacute;n. Y entonces, p&amp;aacute;ginas o formularios a optimizar son los procesos de b&amp;uacute;squedas, operaciones masivas, generaci&amp;oacute;n de reportes, entre otros procesos complejos (1).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;iquest;Pero qu&amp;eacute; pasa, si toda la aplicaci&amp;oacute;n esta lenta?&lt;/b&gt; Sean de mantenimientos simples o complejos, o procesos, todas demoran mucho a comparaci&amp;oacute;n de otra aplicaci&amp;oacute;n (una aplicaci&amp;oacute;n Web frente a una Windows). Sobre todo en esas &lt;a title="Reinventando la rueda" href="http://geeks.ms/blogs/jorge/archive/2008/09/15/reinventando-la-rueda.aspx" target="_blank"&gt;migraciones por tendencia&lt;/a&gt; o moda de una aplicaci&amp;oacute;n Windows a Web, sobretodo si no se tiene muy claro la &lt;a title="Aplicaciones de Escritorio vs Aplicaciones Web, &amp;iquest;hay diferencia en el desarrollo?" href="http://geeks.ms/blogs/sergiotarrillo/archive/2009/01/14/140214.aspx" target="_blank"&gt;infraestructura de una aplicaci&amp;oacute;n web&lt;/a&gt;, el usuario dir&amp;aacute;: pero en la aplicaci&amp;oacute;n Windows era m&amp;aacute;s r&amp;aacute;pido, como le explicas que el navegador tiene que hacer un viaje al servidor, o lo que se conoce como postback en asp.net,&amp;nbsp; para poder ver los resultados. Y la migraci&amp;oacute;n de una aplicaci&amp;oacute;n se puede vender por dos cosas: por mejoras de procesos, o por que va ser m&amp;aacute;s r&amp;aacute;pido, entonces nuevamente por que la web mas lenta, se preguntar&amp;aacute; el usuario. Entonces, si la mayor&amp;iacute;a de formularios est&amp;aacute;n lentos a comparaci&amp;oacute;n de su previa versi&amp;oacute;n, habr&amp;aacute; que revisar el c&amp;oacute;digo base o c&amp;oacute;digo com&amp;uacute;n (2).&lt;/p&gt;
&lt;p&gt;&amp;iquest;&lt;b&gt;Juego de Herramientas o t&amp;eacute;cnicas del buen optimizador&lt;/b&gt;?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;Profiler del motor de base de datos&lt;/b&gt;. En el escenario 1, y el escenario 2, es bueno identificar cuales son las operaciones que se est&amp;aacute;n haciendo contra una base de datos, y el tiempo que est&amp;aacute;n tomando estas operaciones, la cantidad de operaciones que se esta haciendo, quiz&amp;aacute;s es redundante el n&amp;uacute;mero de operaciones. Imaginen, que est&amp;aacute;n haciendo un b&amp;uacute;squeda sobre un cat&amp;aacute;logo de libros, tenemos varios millones de libros en nuestro catalogo, y tenemos que buscar por t&amp;iacute;tulo, descripci&amp;oacute;n, contenidos. Para SQL Server nosotros tenemos &lt;a title="usas SQL Profiler?" href="http://geeks.ms/blogs/sergiotarrillo/archive/2007/07/07/19011.aspx" target="_blank"&gt;SQL Profiler&lt;/a&gt;. Despu&amp;eacute;s de analizar podemos llegar a dos conclusiones, una determina consulta esta tomando un tiempo mayor al esperado, hay que determinar si podemos hacer alguna mejora para &lt;a title="&amp;iquest;Problemas de Performance en un servidor de datos? - Observaciones, recomendaciones, y mejores pr&amp;aacute;cticas" href="http://geeks.ms/blogs/ozonicco/archive/2008/08/23/95681.aspx" target="_blank"&gt;incrementar la performance del servidor de datos&lt;/a&gt;, tambi&amp;eacute;n revisar esta presentaci&amp;oacute;n: &lt;a title="PPTs y Demos del evento de Artalde: SQL Server 2005 - Buenas pr&amp;aacute;cticas para mejorar el rendimiento" href="http://geeks.ms/blogs/rcorral/archive/2007/05/04/ppts-y-demos-del-evento-de-artalde-sql-server-2005-buenas-pr-225-cticas-para-mejorar-el-rendimiento.aspx" target="_blank"&gt;buenas pr&amp;aacute;cticas para mejorar el rendimiento en un servidor SQL Server&lt;/a&gt;. Y si el problema, no esta en la consulta, si no en la recurrencia a la informaci&amp;oacute;n?, en este escenario donde la informaci&amp;oacute;n mostrada cambia pocas veces (una noticia de un diario, las entradas de un blog) se puede hacer el uso de &lt;a title="Uso de la clase Cache de ASP.NET 2.0 fuera de aplicaciones Web." href="http://geeks.ms/blogs/jalarcon/archive/2007/03/28/uso-de-la-clase-cache-de-asp-net-2-0-fuera-de-aplicaciones-web.aspx" target="_blank"&gt;t&amp;eacute;cnicas de Cache&lt;/a&gt;, atenci&amp;oacute;n si la aplicaci&amp;oacute;n tiene alta transaccionalidad es decir se necesita hacer operaciones con la informaci&amp;oacute;n m&amp;aacute;s reciente, imaginad hacer ventas de productos que tienen stock 4 (por que as&amp;iacute; se guardo en la cache) cuando un producto ya no tiene ese stock 4, en este &amp;uacute;ltimo escenario no es aplicable el uso de Cache. &lt;/li&gt;
&lt;li&gt;&lt;b&gt;Profiler de nuestro c&amp;oacute;digo&lt;/b&gt;. Es una manera de identificar cuales son los cuellos de botella dentro de nuestro c&amp;oacute;digo, o para optimizar hasta la &amp;uacute;ltima l&amp;iacute;nea de c&amp;oacute;digo. [.Net] &lt;a title="Carlos Walzer" href="http://msmvps.com/blogs/cwalzer/default.aspx" target="_blank"&gt;Carlos Walzer&lt;/a&gt;, por ejemplo nos muestra el uso de la herramienta &lt;a href="http://www.jetbrains.com/profiler/"&gt;dotTrace 3.0&lt;/a&gt;, para analizar el tiempo y la cantidad de cada una de las llamadas dentro de .Net, con la cual podemos llegar a la mejor forma de hacer las cosas, revisar la serie: &lt;a title="Serie de articulos: Cazando mitos en ADO.NET" href="http://geeks.ms/blogs/sergiotarrillo/archive/2007/11/15/50355.aspx" target="_blank"&gt;Cazando mitos en ADO.NET&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt;&lt;b&gt;Profiler del render del Html (Web)&lt;/b&gt;. En una aplicaci&amp;oacute;n Web, hay otro detalle a tener en cuenta y es el &lt;a title="Aplicaciones de Escritorio vs Aplicaciones Web, &amp;iquest;hay diferencia en el desarrollo?" href="http://geeks.ms/blogs/sergiotarrillo/archive/2009/01/14/140214.aspx" target="_blank"&gt;tama&amp;ntilde;o del html enviado al navegador&lt;/a&gt;. Una excelente herramienta para detectar motivas de lentitud en la carga de una aplicaci&amp;oacute;n web es usar &lt;a title="Localizar motivos de carga lenta en nuestras aplicaciones ASP NET con FireBug &amp;amp; YSloW" href="http://geeks.ms/blogs/cchavez/archive/2008/04/01/localizar-motivos-de-carga-lenta-en-nuestras-aplicaciones-asp-net-con-firebug-y-yslow.aspx" target="_blank"&gt;YSlow&lt;/a&gt;, y si est&amp;aacute;n usando asp.net tambi&amp;eacute;n puede usar la &lt;a title="Understanding Tracing in ASP.NET 2.0" href="http://aspalliance.com/1373_Understanding_Tracing_in_ASPNET_20.all" target="_blank"&gt;caracter&amp;iacute;stica Tracing&lt;/a&gt;, con la cual podemos identificar los m&amp;eacute;todos dentro del ciclo de vida de ejecuci&amp;oacute;n de una p&amp;aacute;gina ASP.NET, adem&amp;aacute;s del tiempo de ejecuci&amp;oacute;n de los mismos, para saber cual demora m&amp;aacute;s; lo otro que podemos identificar el tama&amp;ntilde;o de bytes que ocupa el render de todos los controles de la p&amp;aacute;gina, as&amp;iacute; como el &lt;b&gt;ViewState&lt;/b&gt; &lt;span style="text-decoration:line-through;"&gt;ese monstruito que es bueno pero a la vez es malo&lt;/span&gt; que est&amp;aacute;n ocupando. &lt;a title="decodificando el ViewState... para verle hasta las venas" href="http://geeks.ms/blogs/sergiotarrillo/archive/2008/05/03/84711.aspx" target="_blank"&gt;El ViewState&lt;/a&gt; s&amp;oacute;lo deber&amp;iacute;a ser usado cuando es verdaderamente &amp;uacute;til, todos los controles por defecto tienen habilitado el ViewState. Por ejemplo si ustedes hacen ver c&amp;oacute;digo fuente html de esta p&amp;aacute;gina, encontrar&amp;aacute;n un elemento llamado: __VIEWSTATE, y en este caso de Geeks.ms, y si vamos a un &lt;a title="Online Viewstate Viewer / Decoder for Asp.Net 2.0" href="http://lachlankeown.blogspot.com/2008/05/online-viewstate-viewer-decoder.html" target="_blank"&gt;decoder online&lt;/a&gt;, veremos que s&amp;oacute;lo tiene un valor, que es el c&amp;oacute;digo de la p&amp;aacute;gina, si est&amp;aacute;n desarrollando con ASP.NET, hagan &amp;ldquo;View in Browser&amp;rdquo; y vean el tama&amp;ntilde;o del ViewState, y vean con el decoder que se esta guardando.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Otro detalle a tener es al no liberarse correctamente los recursos y ocupar memoria, &amp;ldquo;fuga de memoria&amp;rdquo;. Dentro de Windows existe una herramienta &lt;a title="Un poco de windbg aplicado..." href="http://geeks.ms/blogs/dsalgado/archive/2008/04/24/reto-i-de-rodrigo-corral-d.aspx" target="_blank"&gt;llamada WinDBG&lt;/a&gt;, que puede ser usado para identificar &lt;a title="Fugando memoria con .Net" href="http://geeks.ms/blogs/rcorral/archive/2008/04/23/fugando-memoria-con-net.aspx" target="_blank"&gt;fugas de memoria dentro de .Net&lt;/a&gt; por ejemplo. Y espec&amp;iacute;ficamente para .Net podemos usar el &lt;b&gt;CLR Profiler&lt;/b&gt;, como en este escenario: &lt;a title="C&amp;oacute;mo cazar una fuga de memoria en .Net" href="http://geeks.ms/blogs/rcorral/archive/2008/05/06/c-243-mo-cazar-una-fuga-de-memoria-en-net-y-ii.aspx" target="_blank"&gt;C&amp;oacute;mo cazar una fuga de memoria en .Net&lt;/a&gt;, tambi&amp;eacute;n podemos &lt;a title="Children of the Damned: Cuidado con vuestras aplicaciones MDI" href="http://geeks.ms/blogs/palvarez/archive/2009/02/02/children-of-the-damned-cuidado-con-vuestras-aplicaciones-mdi.aspx" target="_blank"&gt;usar .NET Memory Profiler&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;&lt;b&gt;Resumiendo&lt;/b&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Se debe especificar, el rango para que una aplicaci&amp;oacute;n sea considera r&amp;aacute;pida o lenta.&lt;/li&gt;
&lt;li&gt;Los formularios de mantenimiento deber&amp;iacute;an ser los m&amp;aacute;s r&amp;aacute;pidos dentro de nuestra aplicaci&amp;oacute;n, por que las operaciones son simples, y debemos seguir las reglas b&amp;aacute;sicas, de paginaci&amp;oacute;n del lado del servidor de datos y liberaci&amp;oacute;n de recursos (conexiones).&lt;/li&gt;
&lt;li&gt;Los formularios especiales, necesitan de herramientas especializadas para identificar donde se encuentra el cuello de botella, o los lugares posibles de optimizaci&amp;oacute;n. Para ello disponemos de Profilers, a nivel del servidor de datos, como tambi&amp;eacute;n a nivel del c&amp;oacute;digo de nuestra aplicaci&amp;oacute;n.&lt;/li&gt;
&lt;li&gt;Para aplicaciones Web, asegurarse que el render del html sea el adecuado.&lt;/li&gt;
&lt;li&gt;Tener cuidado con las fugas de memoria.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;P.D.: Espero que esta lista de herramientas, ayuden a mejorar el rendimiento de sus aplicaciones, en alg&amp;uacute;n momento mostrare algunas de ellas en determinados escenarios para ver su utilidad m&amp;aacute;s claramente, quedan en los drafts como constancia.&lt;/p&gt;
&lt;p&gt;Oros art&amp;iacute;culos de inter&amp;eacute;s:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="El profiler es nuestro amigo!" href="http://geeks.ms/blogs/ilanda/archive/2007/11/11/el-profiler-es-nuestro-amigo.aspx" target="_blank"&gt;El profiler es nuestro amigo!&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="SQL Load Test" href="http://geeks.ms/blogs/ilanda/archive/2008/11/24/sql-load-test.aspx" target="_blank"&gt;SQL Load Test&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="Hacer pruebas, vale... pero hacerlas pa&amp;#39; na..." href="http://geeks.ms/blogs/rcorral/archive/2008/01/07/hacer-pruebas-vale-pero-hacerlas-pa-na.aspx" target="_blank"&gt;Hacer pruebas, vale... pero hacerlas pa&amp;#39; na...&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="Off Road Profiling of ASP.NET Applications" href="https://blogs.msdn.com/graycode/articles/AspNetOffRoadProfilingArticle.aspx" target="_blank"&gt;Off Road Profiling of ASP.NET Applications&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="Comparing performance reports with the Visual Studio Team System Profiler" href="http://blogs.msdn.com/ianhu/archive/2007/04/03/comparing-performance-reports-with-the-visual-studio-team-system-profiler.aspx" target="_blank"&gt;Comparing performance reports with the Visual Studio Team System Profiler&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Saludos,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=142102" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Ado.NET/default.aspx">Ado.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/developer_2B002B00_/default.aspx">developer++</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/.NET/default.aspx">.NET</category><feedburner:origLink>http://geeks.ms/blogs/sergiotarrillo/archive/2009/02/06/142102.aspx</feedburner:origLink></item><item><title>Aplicaciones de Escritorio vs Aplicaciones Web, ¿hay diferencia en el desarrollo?</title><link>http://feedproxy.google.com/~r/sergiotarrillo/~3/vLYTHrf-XN0/140214.aspx</link><pubDate>Wed, 14 Jan 2009 08:38:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:140214</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>16</slash:comments><wfw:commentRss>http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=140214</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2009/01/14/140214.aspx#comments</comments><description>&lt;p&gt;Esto post nace como respuesta a las siguientes preguntas o dudas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Estoy desarrollando una aplicaci&amp;oacute;n Web, en Windows yo usaba el evento KeyPress pero en asp.net, asp, php, jsp, o xsp no se como hacerlo. &lt;/li&gt;
&lt;li&gt;De una p&amp;aacute;gina A env&amp;iacute;o informaci&amp;oacute;n a una p&amp;aacute;gina B, quiero que al cerrar la p&amp;aacute;gina B el foco regrese a la p&amp;aacute;gina A. Esta &amp;uacute;ltima es cl&amp;aacute;sica en los foros, adem&amp;aacute;s de venir con esta nota la final: el c&amp;oacute;digo debe estar con C# 2008 y usando mejores pr&amp;aacute;cticas &lt;/li&gt;
&lt;li&gt;El dise&amp;ntilde;ador de Visual Studio .Net no funciona, arrastre mis controles pero en el navegador se ve todo feo &lt;/li&gt;
&lt;li&gt;Voy a desarrollar una p&amp;aacute;gina, y no se que lenguaje usar JavaScript, C#, JSP, Php, o ASP.Net, &amp;iquest;con cu&amp;aacute;l de estos se ve mejor mi p&amp;aacute;gina? &lt;/li&gt;
&lt;li&gt;Quiero pasar variables usando POST en asp.net, y no se como hacerlo &lt;/li&gt;
&lt;li&gt;&amp;iquest;Cu&amp;aacute;les son los navegadores m&amp;aacute;s usados? Estoy haciendo una web con Php, y no quiero hacer muchas versiones de mi c&amp;oacute;digo, s&amp;oacute;lo para 3 navegadores como m&amp;aacute;ximo &lt;/li&gt;
&lt;li&gt;Estoy haciendo una &lt;a title="Web 2.0" href="http://es.wikipedia.org/wiki/Web_2.0" target="_blank"&gt;Web 2.0&lt;/a&gt;, estoy programando con JavaScript y no puedo conectarme a la base de datos &lt;/li&gt;
&lt;li&gt;-&amp;iquest;Qu&amp;eacute; estas usando para desarrollar tu Web html o xhtml?, &amp;ndash;No uso html, yo estoy usando lo ultimito uso ASP.NET 3.5, dicen que html ya esta desfasado. &lt;/li&gt;
&lt;li&gt;-&amp;iquest;Y ya aprendiste Html y Javascript para tu proyecto Web?, &amp;ndash;No, con Visual Studio .Net ya no se usa eso, s&amp;oacute;lo arrastras controles y programas como en Windows &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para responder a las preguntas vamos a ver una arquitectura simple de dos aplicaciones una Windows (o de escritorio) y una Web&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Aplicaci&amp;oacute;n de Escritorio&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="http://sergiot2.com/blogimages/2009/01Ene/14-Windows.png" src="http://sergiot2.com/blogimages/2009/01Ene/14-Windows.png" /&gt;&lt;/p&gt;
&lt;p&gt;En una aplicaci&amp;oacute;n de escritorio normalmente no iniciamos sesi&amp;oacute;n por cada aplicaci&amp;oacute;n que usemos, s&amp;oacute;lo se inicia sesi&amp;oacute;n una vez cuando prendemos el sistema operativo, asumiendo que vamos a abrir una aplicaci&amp;oacute;n para ver nuestra lista de tareas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;El usuario carga la aplicaci&amp;oacute;n. &lt;/li&gt;
&lt;li&gt;La aplicaci&amp;oacute;n (el c&amp;oacute;digo), se conecta a la base de datos y recupera la informaci&amp;oacute;n del usuario. &lt;/li&gt;
&lt;li&gt;La aplicaci&amp;oacute;n muestra al usuario la informaci&amp;oacute;n solicitada. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;b&gt;Aplicaci&amp;oacute;n Web&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="http://sergiot2.com/blogimages/2009/01Ene/14-Web.png" src="http://sergiot2.com/blogimages/2009/01Ene/14-Web.png" /&gt;&lt;/p&gt;
&lt;p&gt;El usuario desde cualquier parte del mundo y desde cualquier dispositivo (PC, laptop, mobile), desea ver donde ser&amp;aacute; el pr&amp;oacute;ximo @BeerTwit.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;El usuario tiene que ingresar la URL de la p&amp;aacute;gina en su navegador (*1). El navegador por detr&amp;aacute;s se encargar&amp;aacute; de hacer un request (solicitud) al servidor Web usando el protocolo de comunicaci&amp;oacute;n &lt;a title="Hypertext Transfer Protocol (HTTP)" href="http://en.wikipedia.org/wiki/Http" target="_blank"&gt;HTTP&lt;/a&gt; (*2) (internet), y en este caso usar&amp;aacute; el m&amp;eacute;todo GET, por que s&amp;oacute;lo quiere obtener informaci&amp;oacute;n. &lt;/li&gt;
&lt;li&gt;El servidor Web recibe el request y env&amp;iacute;a un response (s&amp;oacute;lo html) al navegador. Los navegadores no entienden el c&amp;oacute;digo ASP, PHP, o JSP, ellos s&amp;oacute;lo muestran contenido en html (*3), es por eso que todos los servidores Web despu&amp;eacute;s de procesar un request devuelven s&amp;oacute;lo html (que puede incluir Javascript (*4)), el html generado debe ser un formulario en html, para que el usuario pueda enviar su informaci&amp;oacute;n. Por otro lado si el usuario ha iniciado sesi&amp;oacute;n con anterioridad es posible que su sesi&amp;oacute;n este activa, y no tenga que iniciar sesi&amp;oacute;n nuevamente. &lt;/li&gt;
&lt;li&gt;El usuario llena su informaci&amp;oacute;n, user y password, y hace clic en el famoso bot&amp;oacute;n &amp;ldquo;Sign in&amp;rdquo;. El navegador por detr&amp;aacute;s recolectar&amp;aacute; esta informaci&amp;oacute;n, y en este caso que se desea enviar esa informaci&amp;oacute;n al servidor debe estar usando el m&amp;eacute;todo POST. Todos los lenguajes usan POST para enviar informaci&amp;oacute;n a una p&amp;aacute;gina, ya sea ASP.NET, Php, JSP, etc (*5). En el caso especial de ASP.NET cuando est&amp;aacute;n desarrollando por defecto todos los formularios se env&amp;iacute;an usando POST, pueden hacer &amp;ldquo;View Source&amp;rdquo; de una p&amp;aacute;gina en el navegador y ver&amp;aacute;n que el formulario html tiene el m&amp;eacute;todo POST. Pueden ver tambi&amp;eacute;n esto usando la herramienta &lt;a title="Fiddler" href="http://geeks.ms/blogs/sergiotarrillo/archive/2008/02/06/69504.aspx" target="_blank"&gt;Fiddler&lt;/a&gt;. Con GET tambi&amp;eacute;n se puede enviar variables, pero no es t&amp;eacute;cnicamente enviar informaci&amp;oacute;n, es mas bien, un obtener informaci&amp;oacute;n con estos par&amp;aacute;metros. &lt;/li&gt;
&lt;li&gt;El request llega al servidor Web, y se ejecutar&amp;aacute; el c&amp;oacute;digo de servidor Php, Jsp, o ASP, que se conectar&amp;aacute; con la base para verificar si existe el usuario y si el password coincide con el enviado por el usuario. &lt;/li&gt;
&lt;li&gt;Si el usuario y el password son validos, el c&amp;oacute;digo de servidor (login.php, login.jsp, o login.aspx), redireccionar&amp;aacute; el request a otra p&amp;aacute;gina showUpdates.php, la cual se conecta nuevamente a la base de datos para traer todos los updates de los amigos del usuario, despu&amp;eacute;s de procesar la p&amp;aacute;gina, el servidor env&amp;iacute;a el response (s&amp;oacute;lo html) al usuario. &lt;/li&gt;
&lt;li&gt;El usuario ve en una p&amp;aacute;gina las &amp;uacute;ltimas actualizaciones de sus amigos, y parece que esta semana no habr&amp;aacute; @BeerTwit, as&amp;iacute; que tendr&amp;aacute; que inventar alguna excusa para generar uno nuevo. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;iquest;Se nota la diferencia por qu&amp;eacute; es distinto para programar para Windows, que programar para Web? &amp;iquest;Todav&amp;iacute;a no?. Vayamos resumiendo:&lt;/p&gt;
&lt;p&gt;*1. El front-end de toda aplicaci&amp;oacute;n Web, siempre acabar&amp;aacute; en un &amp;ldquo;&lt;b&gt;&lt;span style="text-decoration:underline;"&gt;navegador&lt;/span&gt;&lt;/b&gt;&amp;rdquo; y si queremos que se vea bien la mayor&amp;iacute;a de navegadores debemos desarrollar usando est&amp;aacute;ndares, eso evitar&amp;aacute; tener que hacer una versi&amp;oacute;n de Html o Css por cada navegador. Ahora tambi&amp;eacute;n esta de moda tener una versi&amp;oacute;n m&amp;oacute;vil de las aplicaciones: &lt;a title="http://m.elcomercio.com.pe" href="http://m.elcomercio.com.pe"&gt;http://m.elcomercio.com.pe&lt;/a&gt;, &lt;a title="http://m.hi5.com/" href="http://m.hi5.com/"&gt;http://m.hi5.com/&lt;/a&gt;, &lt;a title="http://m.facebook.com" href="http://m.facebook.com"&gt;http://m.facebook.com&lt;/a&gt;, &lt;a title="http://m.twitter.com" href="http://m.twitter.com"&gt;http://m.twitter.com&lt;/a&gt;, &lt;a href="http://m.tuWebAqui.com"&gt;http://m.tuWebAqui.com&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;*2. El protocolo usado para comunicarse con un servidor web es: &amp;ldquo;&lt;a title="Hypertext Transfer Protocol (HTTP)" href="http://en.wikipedia.org/wiki/Http" target="_blank"&gt;&lt;b&gt;HTTP&lt;/b&gt;&lt;/a&gt;&amp;rdquo;, y normalmente usamos HTTP GET o HTTP POST, para cualquier tecnolog&amp;iacute;a de servidor. Revisar este Screencast del genial &lt;a title="David Salgado" href="http://geeks.ms/blogs/dsalgado/" target="_blank"&gt;David Salgado&lt;/a&gt;: &lt;a href="http://channel9.msdn.com/posts/davidsb/Trabajando-con-HTTP-GET-y-HTTP-POST/"&gt;Trabajando con HTTP GET y HTTP POST&lt;/a&gt;, ac&amp;aacute; muestra por ejemplo simular un browser desde .Net haciendo request GET o POST usando la clase &lt;a title="HttpWebRequest class" href="http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.aspx" target="_blank"&gt;HttpWebRequest&lt;/a&gt;, aunque tambi&amp;eacute;n pueden usar la clase &lt;a title="WebClient" href="http://msdn.microsoft.com/en-us/library/system.net.webclient(VS.80).aspx" target="_blank"&gt;WebClient&lt;/a&gt;. Por otro lado existen otros m&amp;eacute;todos de request adem&amp;aacute;s del GET o POST, el uso de estos m&amp;eacute;todos los ver&amp;aacute;n con &lt;a title="Representational state transfer (REST)" href="http://en.wikipedia.org/wiki/Representational_State_Transfer" target="_blank"&gt;REST&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;*3. Ya hemos mencionado que todo servidor Web devuelve al cliente s&amp;oacute;lo &amp;ldquo;&lt;b&gt;&lt;span style="text-decoration:underline;"&gt;HTML&lt;/span&gt;&lt;/b&gt;&amp;rdquo;, por eso importante trabajar con est&amp;aacute;ndares para que nuestro dise&amp;ntilde;o se pueda ver bien en todos los navegadores. &amp;iquest;Por qu&amp;eacute; el c&amp;oacute;digo de mi p&amp;aacute;gina (php, jps, asp.net) no se ve bien? Pues posiblemente sea por que no sabemos HTML o no sabemos &lt;a title="CSS" href="http://geeks.ms/blogs/sergiotarrillo/search.aspx?q=CSS" target="_blank"&gt;CSS&lt;/a&gt; o el dise&amp;ntilde;o no es nuestro tu tema, si vamos a desarrollar una Web tampoco vamos a centrarnos en aprender html a nivel experto, pero si debemos conocer lo b&amp;aacute;sico sobretodo si nosotros estamos encargados de integrar el dise&amp;ntilde;o con la funcionalidad. &amp;iquest;Si soy developer como dise&amp;ntilde;o mi p&amp;aacute;gina Web?, revisar los comentarios en el &lt;a title="VS2008: CSS for Developer (Dummies Designers)" href="http://geeks.ms/blogs/sergiotarrillo/archive/2008/04/11/82923.aspx" target="_blank"&gt;siguiente art&amp;iacute;culo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;*4. Un gran aliado para hacer m&amp;aacute;s din&amp;aacute;mica la interacci&amp;oacute;n de nuestra aplicaci&amp;oacute;n web con el usuario es usar &amp;ldquo;&lt;b&gt;&lt;span style="text-decoration:underline;"&gt;Javascript&lt;/span&gt;&amp;rdquo;&lt;/b&gt;. Recuerden que una aplicaci&amp;oacute;n Web, tiene dos &amp;aacute;mbitos: cuando esta en el cliente (1), y cuando se hace un request y se va al servidor (2) para procesar el request y generar el response. Entonces, o est&amp;aacute; en el navegador del usuario o est&amp;aacute; en el servidor Web, entonces &lt;a title="JavaScript" href="http://en.wikipedia.org/wiki/JavaScript" target="_blank"&gt;JavaScript&lt;/a&gt; es un lenguaje script del lado del cliente, y con el voy poder cambiar elementos dentro de la versi&amp;oacute;n html que este en el cliente. Por ejemplo, puedo con un bot&amp;oacute;n (input: type-button) hacer el llamado a una funci&amp;oacute;n en javascript que cambia el color o contenido a un caja de texto (input: type-text), y para hacer esto en la p&amp;aacute;gina, no es necesario que la p&amp;aacute;gina vaya al servidor, con JavaScript podemos hacer estos cambios del lado del cliente. Si yo hago el cambio de color o contenido de una caja de texto desde un lenguaje de servidor asp o php, la p&amp;aacute;gina tendr&amp;aacute; que viajar al servidor s&amp;oacute;lo para cambiar el color. JavaScript da una mejor interacci&amp;oacute;n con el usuario, pero no todo se puede hacer del lado cliente, por que la data, informaci&amp;oacute;n, el valor, la carnecita, esta en el servidor y hay que viajar para traer esta informaci&amp;oacute;n. Cada vez que se hace un request al servidor Web (sea GET o POST) se refresca toda la p&amp;aacute;gina, lo que da una percepci&amp;oacute;n de lentitud a comparaci&amp;oacute;n de Windows, si quieres mejorar esto una de las opciones es usar &lt;a title="Ajax" href="http://geeks.ms/blogs/sergiotarrillo/search.aspx?q=Ajax" target="_blank"&gt;Ajax&lt;/a&gt;. Siempre es bueno conocer lo b&amp;aacute;sico de JavaScript, sobre todo para cuando estemos trabajando con popUps o cualquier interacci&amp;oacute;n del lado del cliente.&lt;/p&gt;
&lt;p&gt;*5. Y por &amp;uacute;ltimo el &amp;ldquo;&lt;b&gt;&lt;span style="text-decoration:underline;"&gt;lenguaje de servidor&lt;/span&gt;&amp;rdquo;&lt;/b&gt;, que puede ser Php, Asp, Jsp, y todos los dem&amp;aacute;s. Obviamente si tu labor es desarrollar p&amp;aacute;ginas web con acceso a datos, debes dominar el lenguaje de programaci&amp;oacute;n, pero como vimos anteriormente tambi&amp;eacute;n es &amp;uacute;til conocer lo b&amp;aacute;sico de JavaScript, Html, Css, y cuando lo vayas necesitando aprendes m&amp;aacute;s de cada uno de ellos.&lt;/p&gt;
&lt;p&gt;Espero que las preguntas propuestas al inicio, hayan quedado resueltas.&lt;/p&gt;
&lt;p&gt;P.D.: Y recuerden, programar una aplicaci&amp;oacute;n Web no es lo mismo que programar una aplicaci&amp;oacute;n de escritorio, pero si va servir nuestros conocimientos de programaci&amp;oacute;n. En .Net por ejemplo todas las librer&amp;iacute;as, a excepci&amp;oacute;n de las propias de Windows, que hayas aprendido programando Windows, te van servir cuando programas en Web, ejemplo: System.IO, System.Xml, System.Data.SqlClient, System.XYZ.&lt;/p&gt;
&lt;p&gt;Saludos,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=140214" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Windows+Forms/default.aspx">Windows Forms</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Web/default.aspx">Web</category><enclosure url="http://m.facebook.com" length="-1" type="application/xhtml+xml; charset=UTF-8" /><feedburner:origLink>http://geeks.ms/blogs/sergiotarrillo/archive/2009/01/14/140214.aspx</feedburner:origLink></item><item><title>analizando codigo maleado?, tienes que usar NDepend</title><link>http://feedproxy.google.com/~r/sergiotarrillo/~3/AE2JNTSyJM0/139419.aspx</link><pubDate>Fri, 09 Jan 2009 06:02:05 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:139419</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=139419</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2009/01/09/139419.aspx#comments</comments><description>&lt;p&gt;Entiéndase código maleado, a aquel código que todos los miran pero nadie lo quiere tocar, aquel código en el que actualizas un método, y te das cuenta que tienes que actualizar más del 60% de la aplicación.&lt;/p&gt;  &lt;p&gt;El análisis de código, puede ser para entender la arquitectura de una aplicación en particular, para hacer un &lt;a title="Métrica de calidad de código" href="http://geeks.ms/blogs/rcorral/archive/2008/02/13/m-233-trica-de-calidad-de-c-243-digo.aspx" target="_blank"&gt;code review&lt;/a&gt;, o para &lt;a title="Code refactoring" href="http://en.wikipedia.org/wiki/Code_refactoring" target="_blank"&gt;refactorizar&lt;/a&gt; &lt;a title="Getting rid of spaghetti code in the real-world: a Case Study" href="http://codebetter.com/blogs/patricksmacchia/archive/2008/09/23/getting-rid-of-spaghetti-code-in-the-real-world.aspx" target="_blank"&gt;proyectos con código maleado&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Para revisar código, y analizar la implementación del mismo podemos usar &lt;a title="Reflector" href="http://geeks.ms/blogs/sergiotarrillo/archive/2007/12/17/57733.aspx" target="_blank"&gt;Reflector&lt;/a&gt;, podemos saber que métodos dependen de otro, o que métodos usa, pero no tenemos un mapa del uso de métodos, de clases, de namespaces, etc, hasta pensaba &lt;strike&gt;cuando terminé con los drafts del writer&lt;/strike&gt; hacer un programita para hacer esto. Pero esa es una de las features de NDepend, analizar código. &lt;/p&gt;  &lt;p&gt;Vamos a mostrar algunas de las características de &lt;a title="http://www.ndepend.com" href="http://www.ndepend.com" target="_blank"&gt;NDepend&lt;/a&gt; usando mi primera aplicación .Net: &lt;a title="Juego de la Vibora (VB.Net)" href="http://www.solocodigo.com/index.php?opt=viewitem&amp;amp;id=193&amp;amp;type=1&amp;amp;node=1" target="_blank"&gt;Juego de la Vibora (VB.Net)&lt;/a&gt; (Jun-2004, 3er año universitario), sin el reto de hacer esa aplicación quizás ahora estuviera escribiendo alrededor de Java. La pantalla de la aplicación es la siguiente, esta tal cual la hice hace 4 años, más detalles sobre la misma &lt;a title="Visual Basic .NET 	 Juego de la Vibora" href="http://www.solocodigo.com/index.php?opt=viewitem&amp;amp;id=193&amp;amp;type=1&amp;amp;node=1" target="_blank"&gt;en este link&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;img alt="Gusano .Net" src="http://sergiot2.com/blogimages/2009/01Ene/07-Vibora.jpg" border="0" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Al analizar el ejecutable de esta aplicación usando &lt;strong&gt;NDepend&lt;/strong&gt; obtendremos la siguiente ventana (clic sobre la imagen para ampliar):&lt;/p&gt;  &lt;p&gt;&lt;a title="NDepend - Gusano.Net" href="http://sergiot2.com/blogimages/2009/01Ene/07-NDepend.jpg" target="_blank"&gt;&lt;img height="556" alt="NDepend - Gusano.Net" src="http://sergiot2.com/blogimages/2009/01Ene/07-NDepend.jpg" width="740" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Además genera un reporte Web, con todos los resultados generales. Pero en la interfaz de la herramienta nosotros podemos generar nuevos reportes, y gráficos, por ejemplo podemos ver dependencias no sólo a nivel de Namespaces, si no también de clases y métodos, además de poder hacer consultas dinámicamente a nuestro código. Veamos las ventanas disponibles:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Dependency Graph&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;&lt;a title="NDepend - Dependency Graph" href="http://sergiot2.com/blogimages/2009/01Ene/07-NDepend-Dependency-Graph.jpg" target="_blank"&gt;&lt;img height="575" alt="NDepend - Dependency Graph" src="http://sergiot2.com/blogimages/2009/01Ene/07-NDepend-Dependency-Graph.jpg" width="740" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;En este caso estamos viendo el nivel dependencia dentro de la clase Gusano.vb, donde el tamaño de la caja esta determinado por la cantidad de líneas de código.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Dependency Matrix&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;&lt;img alt="http://sergiot2.com/blogimages/2009/01Ene/07-NDepend-Dependency-Matrix.jpg" src="http://sergiot2.com/blogimages/2009/01Ene/07-NDepend-Dependency-Matrix.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;A diferencia de la anterior ventana de dependencia, en esta ventana vemos la dependencia en números, en la selección, hay 6 métodos de la clase FrmGusano.vb, que están usando 11 miembros del tipo (clase) Gusano.vb.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Metrics&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;&lt;a title="NDepends - Metrics" href="http://sergiot2.com/blogimages/2009/01Ene/07-NDepend-Metrics.jpg" target="_blank"&gt;&lt;img height="491" alt="NDepends - Metrics" src="http://sergiot2.com/blogimages/2009/01Ene/07-NDepend-Metrics.jpg" width="740" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Y en esta podemos ver diversas métricas (pre-definidas), de nuestro código. En la selección se esta analizando la métrica Nro de Líneas de código, por método de fondo negro, y las de color azul son el TOP 10, de los métodos con mayor cantidad de líneas de código. Actualmente tiene 82 métricas de código, &lt;a title="NDepend - 82 code metrics" href="http://www.ndepend.com/Features.aspx#Metrics" target="_blank"&gt;leer más&lt;/a&gt;. Recordar también que ahora VS2008, tiene una herramienta llamada &lt;strong&gt;Code Metrics&lt;/strong&gt;, revisar este artículo del buen amigo, &lt;a title="el Bruno" href="http://geeks.ms/blogs/elbruno/default.aspx" target="_blank"&gt;el Bruno&lt;/a&gt;: &lt;a title="[VS2008] Code Metrics" href="http://geeks.ms/blogs/elbruno/archive/2007/09/28/vs2008-code-metrics.aspx" target="_blank"&gt;[VS2008] Code Metrics&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;CQL Query Edition&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;img alt="http://sergiot2.com/blogimages/2009/01Ene/07-NDepend-CQL-Query.jpg" src="http://sergiot2.com/blogimages/2009/01Ene/07-NDepend-CQL-Query.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;Y con esta ventanita que se puede hacer de todo, usando: &lt;strong&gt;Code Query Language&lt;/strong&gt; (&lt;a title="Code Query Language (CQL)" href="http://www.ndepend.com/Features.aspx#CQL" target="_blank"&gt;CQL&lt;/a&gt;), que es un lenguaje de consultas contra nuestro código analizado. En la ventana, se puede apreciar las 10 clases con la mayor cantidad de métodos. Otras consultas que podríamos hacer:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;¿Qué clases implementan un interface en particular?      &lt;br /&gt;SELECT TYPES WHERE IsClass AND Implements &amp;quot;System.IDisposable&amp;quot; &lt;/li&gt;    &lt;li&gt;¿Cuáles son los 10 métodos más complejos, usando la métrica &lt;a title="Cyclomatic complexity" href="http://en.wikipedia.org/wiki/Cyclomatic_complexity" target="_blank"&gt;Cyclomatic complexity&lt;/a&gt;       &lt;br /&gt;SELECT TOP &lt;b&gt;10&lt;/b&gt; METHODS ORDER BY CyclomaticComplexity &lt;/li&gt;    &lt;li&gt;Revisar más opciones de &lt;a title="Code Query Language (CQL)" href="http://www.ndepend.com/Features.aspx#CQL" target="_blank"&gt;CQL&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Algunos artículos sobre la aplicación de NDepend en algunos escenarios reales, código bien maleado:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="Getting rid of spaghetti code in the real-world: a Case Study" href="http://codebetter.com/blogs/patricksmacchia/archive/2008/09/23/getting-rid-of-spaghetti-code-in-the-real-world.aspx" target="_blank"&gt;Getting rid of spaghetti code in the real-world: a Case Study&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a title="Using NDepend on large project, a success story" href="http://www.dotnetguru2.org/sandreo/index.php?p=988" target="_blank"&gt;Using NDepend on large project, a success story&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;También en el blog de &lt;a title="Patrick Smacchia" href="http://codebetter.com/blogs/patricksmacchia/default.aspx" target="_blank"&gt;Patrick Smacchia&lt;/a&gt;, Lead Developer de la herramienta, encontrarán muchas entradas sobre NDepend: &lt;a href="http://codebetter.com/search/SearchResults.aspx?q=NDepend&amp;amp;s=151" target="_blank"&gt;Varios artículos de Patrick sobre NDepend&lt;/a&gt;. Y la página del producto: &lt;a title="http://www.ndepend.com" href="http://www.ndepend.com"&gt;http://www.ndepend.com&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Artículos relacionados:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="Ndepend (Analyze Code/Structure Tool!)" href="http://geeks.ms/blogs/jersson/archive/2008/05/24/la-caja-presentaci-243-n-ndepend-analyze-code-structure-tool-art-237-culo-recomendado.aspx" target="_blank"&gt;Ndepend (Analyze Code/Structure Tool!)&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a title=".NET Projects: Analyzing Code with NDepend" href="http://grantpalin.com/2008/03/26/net-projects-analyzing-code-with-ndepend/" target="_blank"&gt;.NET Projects: Analyzing Code with NDepend&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a title="NDepend: code metrics at your service" href="http://blog.andreloker.de/post/2008/07/08/NDepend-code-metrics-at-your-service.aspx" target="_blank"&gt;NDepend: code metrics at your service&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a title="Getting Up-to-Speed on NDepend and Code Metrics" href="http://www.infoq.com/news/2008/07/ndepend-tutorial" target="_blank"&gt;Getting Up-to-Speed on NDepend and Code Metrics&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a title="Exiting The Zone of Pain - Static Analysis with NDepend" href="http://www.hanselman.com/blog/ExitingTheZoneOfPainStaticAnalysisWithNDepend.aspx" target="_blank"&gt;Exiting The Zone of Pain - Static Analysis with NDepend&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a title="Enterprise .NET Community: Control component dependencies to gain clean architecture" href="http://www.theserverside.net/tt/articles/showarticle.tss?id=ControllingDependencies" target="_blank"&gt;Enterprise .NET Community: Control component dependencies to gain clean architecture&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a title="An Amazing Introduction to NDepend" href="http://codebetter.com/blogs/patricksmacchia/archive/2008/07/08/an-amazing-introduction-to-ndepend.aspx" target="_blank"&gt;An Amazing Introduction to NDepend&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Saludos,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=139419" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Rapitools/default.aspx">Rapitools</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/developer_2B002B00_/default.aspx">developer++</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/.NET/default.aspx">.NET</category><feedburner:origLink>http://geeks.ms/blogs/sergiotarrillo/archive/2009/01/09/139419.aspx</feedburner:origLink></item><item><title>encriptando o cifrando informacion?</title><link>http://feedproxy.google.com/~r/sergiotarrillo/~3/oBI2_XttB_g/131910.aspx</link><pubDate>Fri, 19 Dec 2008 07:17:37 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:131910</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>11</slash:comments><wfw:commentRss>http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=131910</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2008/12/19/131910.aspx#comments</comments><description>&lt;p&gt;&lt;img alt="http://sergiot2.com/blogimages/2008/12Dic/Criptografia.jpg" src="http://sergiot2.com/blogimages/2008/12Dic/Criptografia.jpg" /&gt;&lt;/p&gt; &lt;p&gt;La necesidad de encriptar (ocultar a simple vista) información no es necesidad propia en los sistemas de información, su inicio y apogeo fue marcado por las diversas guerras que hubo en la historia, se presume desde &lt;a title="Historia de la criptograf&amp;iacute;a" href="http://es.wikipedia.org/wiki/Criptograf%C3%ADa#Historia_de_la_criptograf.C3.ADa" target="_blank"&gt;las campañas militares de los romanos hasta las últimas guerras mundiales&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;&lt;strong&gt;¿Qué ha cambiado, en el presente?&lt;/strong&gt; Pues que ahora contamos con computadores más potentes capaces de poder desencriptar (vamos a usar estos neologismos en la entrada, &lt;strike&gt;si prefiere, reemplazar por cifrar/descifrar&lt;/strike&gt;) la información &amp;quot;oculta&amp;quot;, utilizando &lt;a href="http://es.wikipedia.org/wiki/Ataque_de_fuerza_bruta" target="_blank"&gt;fuerza bruta&lt;/a&gt; por ejemplo. Y desde hace décadas se tratado de mejorar y llevar al proceso de estandarización los algoritmos de encriptación.&lt;/p&gt; &lt;p&gt;Veamos, un ejemplo sencillo usando el método de encriptación CCQSMO &lt;strike&gt;cualquier cosa que se me ocurra&lt;/strike&gt;:&lt;/p&gt; &lt;p&gt;La palabra Geeks.ms:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Obtener el código &lt;a title="ASCII" href="http://es.wikipedia.org/wiki/ASCII" target="_blank"&gt;Ascii&lt;/a&gt;: 7110110110711546109115  &lt;li&gt;Le sumamos 10 (clave) a cada código Ascii: 8111111111712556119125  &lt;li&gt;Volvemos a convertir a cadena, y tenemos nuestra cadena encriptada: Qoou}8w}&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Obviamente hay algoritmos de encriptación, y hay &amp;quot;algoritmos&amp;quot;. Vamos a repasar algunos de estos métodos y sus respectivas codificaciones, pero antes vamos diferenciar &lt;a title="criptograf&amp;iacute;a" href="http://es.wikipedia.org/wiki/Criptograf%C3%ADa" target="_blank"&gt;algoritmos de encriptación&lt;/a&gt; y métodos de cifrado &lt;a title="Cryptographic hash function" href="http://en.wikipedia.org/wiki/Cryptographic_hash_function" target="_blank"&gt;Hash&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;¿Se han preguntado porqué cuando se registran en algunos foros, al hacer un &amp;quot;recovery password&amp;quot;, no me devuelve el password que he perdido, el sistema devuelve un nuevo password. ¿Por qué? Es que no esta usando un algoritmo de encriptación para ocultar el password, esta usando una función Hash, y es en un sólo sentido, en otras palabras, no se puede recuperar la cadena original a partir del password. ¿Entonces, cómo hace el match?, pues lo que hace no es desencriptar el password cifrado, para compararlo con el input del usuario, lo que hace es volver a cifrar/encriptar el input, y si el input cifrado coincide con el password cifrado que esta en la base de datos, entonces valida exitosamente tus credenciales. Mas detalles: &lt;a title="Hash vs Encryption" href="http://www.infocellar.com/networks/Security/hash.htm" target="_blank"&gt;Hash vs Encryption&lt;/a&gt; y &lt;a title="Hashing vs. Encryption" href="http://www.chilkatsoft.com/faq/HashVsEncrypt.html" target="_blank"&gt;Hashing vs. Encryption&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Hecho esta aclaraciones vamos a listar los métodos de &lt;a title="criptograf&amp;iacute;a" href="http://es.wikipedia.org/wiki/Criptograf%C3%ADa" target="_blank"&gt;criptografía&lt;/a&gt;, a los cuales podemos encontrar en dos grandes grupos:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;1.a) &lt;/strong&gt;&lt;a title="Criptograf&amp;iacute;a sim&amp;eacute;trica" href="http://es.wikipedia.org/wiki/Criptograf%C3%ADa_sim%C3%A9trica" target="_blank"&gt;&lt;strong&gt;Criptografía simétrica&lt;/strong&gt;&lt;/a&gt; (&lt;a title="Symmetric-key algorithm" href="http://en.wikipedia.org/wiki/Symmetric_key_algorithm" target="_blank"&gt;en&lt;/a&gt;):&lt;/p&gt; &lt;p&gt;Estos algoritmos, usan una misma clave para encriptar/desencriptar el mensaje. En .Net tenemos el namespace: &lt;a title="System.Security.Cryptography namespace" href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.aspx" target="_blank"&gt;System.Security.Cryptography&lt;/a&gt;, para las operación de encriptación:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a title="Data Encryption Standard (DES)" href="http://es.wikipedia.org/wiki/Data_Encryption_Standard" target="_blank"&gt;DES&lt;/a&gt;, Data Encryption Standard, se considera inseguro para muchas aplicaciones debido a que su clave es de 56 bits, recientes algoritmos de claves simétricas usan claves de 128 bits. En este artículo: &lt;a title="Encrypt/Decrypt String using DES in C#" href="http://www.codeproject.com/KB/cs/NET_Encrypt_Decrypt.aspx" target="_blank"&gt;Encrypt/Decrypt String using DES in C#&lt;/a&gt;, usa la clase &lt;a title="DESCryptoServiceProvider class" href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.descryptoserviceprovider.aspx" target="_blank"&gt;DESCryptoServiceProvider&lt;/a&gt;. También puede revisar este artículo: &lt;a title="Simple Cryptographer - Simple DES/AES Implementation in C#" href="http://www.codeproject.com/KB/recipes/Simple_Cryptographer.aspx" target="_blank"&gt;Simple Cryptographer - Simple DES/AES Implementation in C#&lt;/a&gt;, o este hilo del foro: &lt;a title="Help with DES Encryption &amp;amp; Decryption using C#.Net" href="http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/6cd1aaa4-4bb0-4420-8526-ba8e9f194989/" target="_blank"&gt;Help with DES Encryption &amp;amp; Decryption using C#.Net&lt;/a&gt;, revisar la respuesta final de la primera página.  &lt;li&gt;&lt;a title="Triple DES" href="http://es.wikipedia.org/wiki/3DES" target="_blank"&gt;3DES&lt;/a&gt;, o Triple DES, que hace triple encriptación de &lt;a title="Data Encryption Standard (DES)" href="http://es.wikipedia.org/wiki/Data_Encryption_Standard" target="_blank"&gt;DES&lt;/a&gt;. Se usa a través de la clase: &lt;a title="TripleDESCryptoServiceProvider class" href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.tripledescryptoserviceprovider.aspx" target="_blank"&gt;TripleDESCryptoServiceProvider&lt;/a&gt;, puede ver algunos ejemplos en los siguientes artículos: &lt;a title="Encryption/Decryption using RSA, DES, 3DES and Rijindael in VS.Net 2005" href="http://www.vbdotnetheaven.com/UploadFile/chauhan_sonu57/Encryption104192006090933AM/Encryption1.aspx" target="_blank"&gt;Encryption/Decryption using RSA, DES, 3DES and Rijindael in VS.Net 2005&lt;/a&gt; y &lt;a title="Library Encrypt and Decrypt Methods Using TripleDES and MD5" href="http://www.csharper.net/blog/library_encrypt_and_decrypt_methods_using_tripledes_and_md5.aspx" target="_blank"&gt;Library Encrypt and Decrypt Methods Using TripleDES and MD5&lt;/a&gt;.  &lt;li&gt;&lt;a title="AES - Advanced Encryption Standard" href="http://es.wikipedia.org/wiki/AES" target="_blank"&gt;AES&lt;/a&gt;, Advanced Encryption Standard o también conocido como Rijndael, es un esquema de cifrado por bloques y actualmente es el más popular dentro de los algoritmos simétricos, fue creado para reemplazar al &lt;a title="Data Encryption Standard (DES)" href="http://es.wikipedia.org/wiki/Data_Encryption_Standard" target="_blank"&gt;DES&lt;/a&gt;. Este algoritmo es implementado usando la clase &lt;a title="AesCryptoServiceProvider class" href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.aescryptoserviceprovider.aspx" target="_blank"&gt;AesCryptoServiceProvider&lt;/a&gt; (only .Net 3.5), aquí algunos ejemplos: &lt;a title="Visual Studio &amp;quot;Orcas&amp;quot;: finally a BigInteger and a lot faster AES" href="http://drazen.dotlic.name/weblog/archive/2007/04/11/926.aspx" target="_blank"&gt;Visual Studio &amp;quot;Orcas&amp;quot;: finally a BigInteger and a lot faster AES&lt;/a&gt; y &lt;a title=".Net Encryption simple AES wrapper" href="http://blog.realcoderscoding.com/index.php/2008/07/dot-net-encryption-simple-aes-wrapper/" target="_blank"&gt;.Net Encryption simple AES wrapper&lt;/a&gt;. Para las versiones anteriores del .Net Framework puede revisar los siguientes artículos: &lt;a title="How To: Encrypt and Decrypt Data Using a Symmetric (Rijndael) Key (C#/VB.NET)" href="http://www.obviex.com/samples/Encryption.aspx" target="_blank"&gt;How To: Encrypt and Decrypt Data Using a Symmetric (Rijndael) Key (C#/VB.NET)&lt;/a&gt; y &lt;a title="Simple Cryptographer - Simple DES/AES Implementation in C#" href="http://www.codeproject.com/KB/recipes/Simple_Cryptographer.aspx" target="_blank"&gt;Simple Cryptographer - Simple DES/AES Implementation in C#&lt;/a&gt;.  &lt;li&gt;&lt;a title="International Data Encryption Algorithm" href="http://es.wikipedia.org/wiki/IDEA" target="_blank"&gt;IDEA&lt;/a&gt;, International Data Encryption Algorithm, también usa el cifrado en bloques y aunque no encontré muchos ejemplos, encontré una implementación en C: &lt;a title="IDEA.c" href="http://www.google.com/search?hl=en&amp;amp;q=IDEA.c&amp;amp;btnG=Search" target="_blank"&gt;IDEA.c&lt;/a&gt;. ¿Será por las &lt;a title="Encryption Algorithms for Developers, OEMs" href="http://products.enterpriseitplanet.com/security/encryption/1115829950.html" target="_blank"&gt;patentes de este algoritmo&lt;/a&gt; lo tiene la empresa MediaCrypt y se necesita licencian para usarlo comercialmente? Por cierto la evolución de IDEA, es: &lt;a title="IDEA NXT" href="http://en.wikipedia.org/wiki/IDEA_NXT" target="_blank"&gt;IDEA NXT&lt;/a&gt;.  &lt;li&gt;&lt;a title="Blowfish" href="http://es.wikipedia.org/wiki/Blowfish" target="_blank"&gt;Blowfish&lt;/a&gt;, usa bloques de 64 &lt;a href="http://es.wikipedia.org/wiki/Bit"&gt;bits&lt;/a&gt; y claves que van desde los 32 bits hasta 448 bits. Hay una implementación: Markus Hahn, &lt;a title="Blowfish.NET" href="http://www.hotpixel.net/software.html" target="_blank"&gt;Blowfish.NET&lt;/a&gt; (según el autor del algoritmo &lt;a href="http://es.wikipedia.org/wiki/Bruce_Schneier"&gt;Bruce Schneier&lt;/a&gt;, es una de las &lt;a href="http://www.schneier.com/blowfish-download.html" target="_blank"&gt;implementaciones más rápidas&lt;/a&gt;) y la otra implementación fue desarrollado por Russ Young: &lt;a title="Blowfish.cs" href="http://www.koders.com/csharp/fidD5E0D7AC50858EA8F7131E8CD2746F3471A1B953.aspx" target="_blank"&gt;Blowfish.cs&lt;/a&gt;.  &lt;li&gt;Series RC, de &lt;a title="Ron Rivest" href="http://en.wikipedia.org/wiki/Ron_Rivest" target="_blank"&gt;Ron Rivest&lt;/a&gt;: , y aunque &lt;a title="System.Security.Cryptography namespace" href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.aspx" target="_blank"&gt;System.Security.Cryptography&lt;/a&gt; tiene una clase para &lt;a title="RC2" href="http://en.wikipedia.org/wiki/RC2" target="_blank"&gt;RC2&lt;/a&gt;: &lt;a title="RC2CryptoServiceProvider" href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.rc2cryptoserviceprovider.aspx" target="_blank"&gt;RC2CryptoServiceProvider&lt;/a&gt;, no tiene una clase para la versión &lt;a title="RC4" href="http://en.wikipedia.org/wiki/RC4" target="_blank"&gt;RC4&lt;/a&gt;, pero en &lt;a title="SourceForge" href="http://en.wikipedia.org/wiki/Sourceforge" target="_blank"&gt;SourceForge&lt;/a&gt; hay una librería: &lt;a title="RC4.NET" href="http://sourceforge.net/projects/rc4dotnet/" target="_blank"&gt;RC4.NET&lt;/a&gt;, también puede revisar estos artículos: &lt;a title="RC4 Encryption Algorithm: C# Version" href="http://www.codeproject.com/KB/recipes/rc4csharp.aspx" target="_blank"&gt;RC4 Encryption Algorithm: C# Version&lt;/a&gt; y &lt;a title="RC4 Encryption" href="http://dotnet-snippets.com/dns/rc4-encryption-SID577.aspx" target="_blank"&gt;RC4 Encryption&lt;/a&gt;.  &lt;li&gt;Hay otros algoritmos que se quedaron en la cola (también de las referencias) en el proceso de creación del &lt;a title="AES" href="http://en.wikipedia.org/wiki/Advanced_Encryption_Standard" target="_blank"&gt;AES&lt;/a&gt;, sucesor del &lt;a title="Data Encryption Standard (DES)" href="http://es.wikipedia.org/wiki/Data_Encryption_Standard" target="_blank"&gt;DES&lt;/a&gt;: &lt;a href="http://en.wikipedia.org/wiki/CAST-256"&gt;CAST-256&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/CRYPTON"&gt;CRYPTON&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/DEAL"&gt;DEAL&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/DFC_%28cipher%29"&gt;DFC&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/E2_%28cipher%29"&gt;E2&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/FROG"&gt;FROG&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Hasty_Pudding_cipher"&gt;HPC&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/LOKI97"&gt;LOKI97&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/MAGENTA"&gt;MAGENTA&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/MARS_%28cryptography%29"&gt;MARS&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/RC6"&gt;RC6&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Rijndael"&gt;Rijndael&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/SAFER"&gt;SAFER+&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Serpent_%28cipher%29"&gt;Serpent&lt;/a&gt;, and &lt;a href="http://en.wikipedia.org/wiki/Twofish"&gt;Twofish&lt;/a&gt;. Leer más: &lt;a title="Advanced Encryption Standard process" href="http://en.wikipedia.org/wiki/Advanced_Encryption_Standard_process" target="_blank"&gt;Advanced Encryption Standard process&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;strong&gt;1.b) &lt;/strong&gt;&lt;strong&gt;Criptografía asimétrica&lt;/strong&gt; (&lt;a title="Public key cryptography" href="http://en.wikipedia.org/wiki/Public_key_cryptography" target="_blank"&gt;en&lt;/a&gt;): &lt;/p&gt; &lt;p&gt;Usa dos claves para el envió de mensajes, una clave pública y una clave privada. El destinatario del mensaje es el que posee estas dos claves, y envía la clave pública al remitente, y sólo con la clave privada (que tiene sólo el destinatario) puede desencriptar el mensaje.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a title="RSA" href="http://es.wikipedia.org/wiki/RSA" target="_blank"&gt;RSA&lt;/a&gt;, es uno de los más conocidos en criptografía asimétrica. En .Net podemos usar la clase &lt;a title="RSACryptoServiceProvider class" href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.rsacryptoserviceprovider.aspx" target="_blank"&gt;RSACryptoServiceProvider&lt;/a&gt;, aquí un ejemplo: &lt;a title="Public Key RSA Encryption in C# .NET" href="http://www.codeproject.com/KB/security/RSACryptoPad.aspx" target="_blank"&gt;Public Key RSA Encryption in C# .NET&lt;/a&gt;, y &lt;a title="RSA Encryption in C#" href="http://www.dotnetspider.com/resources/692-RSA-Encryption-C.aspx" target="_blank"&gt;RSA Encryption in C#&lt;/a&gt;.  &lt;li&gt;&lt;a title="Digital Signature Algorithm" href="http://en.wikipedia.org/wiki/Digital_Signature_Algorithm" target="_blank"&gt;DSA&lt;/a&gt;, Digital Signature Algorithm, es un estándar para firmas digitales. En .Net podemos usar la clase &lt;a title="DSACryptoServiceProvider class" href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.dsacryptoserviceprovider.aspx" target="_blank"&gt;DSACryptoServiceProvider&lt;/a&gt;, artículos: &lt;a title="Hashing, MACs, and Digital Signatures in .NET" href="http://dotnetslackers.com/articles/security/Hashing_MACs_and_Digital_Signatures_in_NET.aspx" target="_blank"&gt;Hashing, MACs, and Digital Signatures in .NET&lt;/a&gt;.  &lt;li&gt;También revisar el algoritmo &lt;a title="ElGamal" href="http://es.wikipedia.org/wiki/ElGamal" target="_blank"&gt;ElGamal&lt;/a&gt;, basado en el protocolo &lt;a title="Diffie-Hellman" href="http://es.wikipedia.org/wiki/Diffie-Hellman" target="_blank"&gt;Diffie-Hellman&lt;/a&gt;. Y también revisar &lt;a title="PKCS" href="http://es.wikipedia.org/wiki/PKCS" target="_blank"&gt;PKCS&lt;/a&gt;, &lt;a title="Public Key Cryptography Standards" href="http://en.wikipedia.org/wiki/PKCS" target="_blank"&gt;Public Key Cryptography Standards&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;2) &lt;/strong&gt;&lt;a title="Cryptographic hash function" href="http://en.wikipedia.org/wiki/Cryptographic_hash_function" target="_blank"&gt;&lt;strong&gt;Funciones de encriptación hash&lt;/strong&gt;&lt;/a&gt;: &lt;/p&gt; &lt;p&gt;Como comenté al inicio, es encriptación (o cifrado) en &lt;a href="http://www.cs.rit.edu/~ark/lectures/onewayhash/onewayhash.shtml" target="_blank"&gt;un sólo sentido&lt;/a&gt;, no se puede recuperar el texto original a parte del texto encriptado. Además de tener la particularidad de generar un texto de un tamaño específico, siendo único cada contenido generado.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a title="Message-Digest algorithm 5" href="http://en.wikipedia.org/wiki/MD5" target="_blank"&gt;MD5&lt;/a&gt;, Message-Digest algorithm 5, es ampliamente usado y dicen que parcialmente inseguro (ver detalles en wikipedia). En .Net tenemos la clase &lt;a title="MD5CryptoServiceProvider class" href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.md5cryptoserviceprovider.aspx" target="_blank"&gt;MD5CryptoServiceProvider&lt;/a&gt;, algunos artículos: &lt;a title="HOWTO: Encode a password using MD5 in C# (or: howto calculate the MD5 hash for a string)" href="http://bloggingabout.net/blogs/rick/archive/2005/05/18/4118.aspx" target="_blank"&gt;HOWTO: Encode a password using MD5 in C# (or: howto calculate the MD5 hash for a string)&lt;/a&gt; y &lt;a title="How to get MD5 hash in C# . NET" href="http://blog.brezovsky.net/en-text-2.html" target="_blank"&gt;How to get MD5 hash in C# . NET&lt;/a&gt;, y como dicen en este último es similar a la &lt;a title="funci&amp;oacute;n MD5 de Php" href="http://www.php.net/md5" target="_blank"&gt;función MD5 de Php&lt;/a&gt;.  &lt;li&gt;&lt;a title="SHA hash functions" href="http://en.wikipedia.org/wiki/SHA_hash_functions" target="_blank"&gt;Serie SHA&lt;/a&gt;, Secure Hash Algorithm, existen varias series SHA-1, y en la familia SHA-2: SHA-224, SHA-256, SHA-384, y SHA-512. Donde la principal diferencia es el tamaño generado para el mensaje cifrado, como se puede ver en los resultados del siguiente artículo: NetSHA&lt;a title=": a Complete SHA implementation for the .NET Framework using C#" href="http://islab.oregonstate.edu/koc/ece575/04Project1/Nelson/NetSHA.htm" target="_blank"&gt;: a Complete SHA implementation for the .NET Framework using C#&lt;/a&gt;, .Net soporta los siguientes SHA-*: &lt;a title="SHA1CryptoServiceProvider class" href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha1cryptoserviceprovider.aspx" target="_blank"&gt;SHA1CryptoServiceProvider&lt;/a&gt;, &lt;a title="SHA256CryptoServiceProvider class" href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha256cryptoserviceprovider.aspx" target="_blank"&gt;SHA256CryptoServiceProvider&lt;/a&gt;, &lt;a title="SHA384CryptoServiceProvider class" href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha384cryptoserviceprovider.aspx" target="_blank"&gt;SHA384CryptoServiceProvider&lt;/a&gt;, y &lt;a title="SHA512CryptoServiceProvider" href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha512cryptoserviceprovider.aspx" target="_blank"&gt;SHA512CryptoServiceProvider&lt;/a&gt;. Aquí un ejemplo de como usar SHA-1: &lt;a title="SHA1 hash calculation in C#" href="http://dotnetpulse.blogspot.com/2007/12/sha1-hash-calculation-in-c.html" target="_blank"&gt;SHA1 hash calculation in C#&lt;/a&gt;, también puede revisar el siguiente artículo: &lt;a title="How To: Hash Data with Salt (C#/VB.NET)" href="http://www.obviex.com/samples/hash.aspx" target="_blank"&gt;How To: Hash Data with Salt (C#/VB.NET)&lt;/a&gt;.  &lt;li&gt;Si desea ver otras funciones Hash, las puede ver la siguiente lista: &lt;a title="List of cryptographic hash functions" href="http://en.wikipedia.org/wiki/Cryptographic_hash_function#List_of_cryptographic_hash_functions" target="_blank"&gt;List of cryptographic hash functions&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Ahora que ya vimos, los algoritmos de encriptación y funciones hash. Vayamos con algunos ejemplos, y su aplicabilidad dentro del entorno .Net&lt;/p&gt; &lt;p&gt;&lt;strong&gt;a)&lt;/strong&gt; Encriptando secciones del web.config, con estos artículos queda clarísimo: &lt;a title="Cifrado de informaci&amp;oacute;n en los archivos de configuraci&amp;oacute;n de ASP.NET" href="http://geeks.ms/blogs/jalarcon/archive/2008/04/28/cifrado-de-informaci-243-n-en-los-archivos-de-configuraci-243-n-de-asp-net.aspx" target="_blank"&gt;Cifrado de información en los archivos de configuración de ASP.NET&lt;/a&gt; y &lt;a title="Encrypting Configuration Information in ASP.NET 2.0 Applications" href="http://aspnet.4guysfromrolla.com/articles/021506-1.aspx" target="_blank"&gt;Encrypting Configuration Information in ASP.NET 2.0 Applications&lt;/a&gt;. Podemos usar dos providers: &lt;a title="How To: Encrypt Configuration Sections in ASP.NET 2.0 Using RSA" href="http://msdn.microsoft.com/en-us/library/ms998283.aspx" target="_blank"&gt;RSA&lt;/a&gt; o &lt;a title="How To: Encrypt Configuration Sections in ASP.NET 2.0 Using DPAPI" href="http://msdn.microsoft.com/en-us/library/ms998280.aspx" target="_blank"&gt;DPAPI&lt;/a&gt;, básicamente DPAPI es más segura por que esta atada a la máquina donde se realiza la encriptación (leer &lt;a title="Cifrado de informaci&amp;oacute;n en los archivos de configuraci&amp;oacute;n de ASP.NET" href="http://geeks.ms/blogs/jalarcon/archive/2008/04/28/cifrado-de-informaci-243-n-en-los-archivos-de-configuraci-243-n-de-asp-net.aspx" target="_blank"&gt;los comentarios de José M.A.&lt;/a&gt;). Pero el proveedor &lt;a title="Data protection API" href="http://en.wikipedia.org/wiki/Data_protection_API" target="_blank"&gt;DPAPI&lt;/a&gt; (&lt;a title="DpapiProtectedConfigurationProvider" href="http://msdn.microsoft.com/en-us/library/system.configuration.dpapiprotectedconfigurationprovider(VS.80).aspx" target="_blank"&gt;DpapiProtectedConfigurationProvider&lt;/a&gt;), qué algoritmo usa? Utiliza una API del sistema operativo llamada &lt;a title="Windows Data Protection" href="http://msdn.microsoft.com/en-us/library/ms995355.aspx" target="_blank"&gt;Windows Data Protection&lt;/a&gt;, y es expuesta a través de: &lt;a title="Crypt32.dll" href="http://msdn.microsoft.com/en-us/library/aa379884(VS.85).aspx" target="_blank"&gt;Crypt32.dll&lt;/a&gt; (Win32).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;b)&lt;/strong&gt; ¿Que algoritmo de encriptación usa el servicio de membership de ASP.NET 2.0+? Si estamos usando el &lt;a title="How To: Use Membership in ASP.NET 2.0" href="http://msdn.microsoft.com/en-us/library/ms998347.aspx" target="_blank"&gt;servicio de Membership de ASP.NET 2.0+&lt;/a&gt;, dentro del web.config, en el elemento &lt;a title="membership element" href="http://msdn.microsoft.com/en-us/library/1b9hw62f.aspx" target="_blank"&gt;membership&lt;/a&gt;, nosotros podemos definir el formato del password a almacenar en la base de datos, y puede ser de tres tipos: Clear, Encrypted, and Hashed. &lt;strong&gt;Clear&lt;/strong&gt;, almacena el password en texto plano (&lt;strike&gt;por si me olvidó, o me gusta modificar el password directamente en la base de datos con un Open Table&lt;/strike&gt;), &lt;strong&gt;Hashed&lt;/strong&gt; para usar una función hash (en un sólo sentido), y &lt;strong&gt;Encrypted&lt;/strong&gt;, para poder encriptar/desencriptar un password. ¿Qué implicancia tiene, usar Hashed o Encrypted?, pues que si estamos usando el control &lt;a title="PasswordRecovery" href="http://quickstarts.asp.net/QuickStartv20/aspnet/doc/ctrlref/login/passwordrecovery.aspx" target="_blank"&gt;PasswordRecovery&lt;/a&gt;, con el formato Hashed no vamos a poder recuperar el password, lo que hará el control es generar un nuevo password, recuerden que Hash es un sólo sentido. ¿Qué algoritmos usa, y donde lo configuro? La configuración se hace en el elemento &lt;a title="machineKey element" href="http://msdn.microsoft.com/en-us/library/w8h3skw9.aspx" target="_blank"&gt;machineKey&lt;/a&gt;, y puedo usar las funciones hash MD5 y SHA1, y los algoritmos de encriptación simétrica 3DES y AES.&lt;/p&gt; &lt;p&gt;P.D.: Esto es el fruto &lt;strike&gt;de dos amanecidas hasta las 2:00 a.m.&lt;/strike&gt;, una rápida revisión a los algoritmos de encriptación, y sus respectivas implementaciones en .NET, que lo disfruten!&lt;/p&gt; &lt;p&gt;Saludos,&lt;a title="http://www.15seconds.com/Issue/021210.htm" href="http://www.15seconds.com/Issue/021210.htm"&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=131910" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/.NET/default.aspx">.NET</category><feedburner:origLink>http://geeks.ms/blogs/sergiotarrillo/archive/2008/12/19/131910.aspx</feedburner:origLink></item><item><title>[Ado.Net] Clase de conexion generica para cualquier motor de base datos, usando .Net Providers</title><link>http://feedproxy.google.com/~r/sergiotarrillo/~3/ygR95hG1_qA/123658.aspx</link><pubDate>Wed, 03 Dec 2008 00:35:31 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:123658</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>11</slash:comments><wfw:commentRss>http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=123658</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2008/12/02/123658.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;Problema&lt;/strong&gt;: En internet hay mucha información sobre como trabajar con Ado.Net y SQL, pero cuando tenemos que usar un nuevo proveedor&amp;nbsp; de base de datos desde .Net, comenzamos a buscar ejemplos específicos sin darnos cuenta, que también podemos usar los ejemplos de Ado.Net y SQL (usar la estructura).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Solución&lt;/strong&gt;: Exponer una estructura básica de Ado.NET para las diversas operaciones que podemos hacer una fuente de datos, consultar, insertar, actualizar, y eliminar, y que esta estructura puede ser usada con cualquier proveedor disponible en .Net.&lt;/p&gt; &lt;p&gt;En el artículo usaremos las clases: XyzConnection, XyzCommand, XyzDataReader, y un XyzParameter, para presentar las clases base que después pueden ser reemplazadas (en la mayoría de casos) por las siguientes clases de acuerdo a los proveedores:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;SQL Server&lt;/strong&gt;: &lt;a title="SqlConnection Class" href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.aspx" target="_blank"&gt;SqlConnection&lt;/a&gt;, &lt;a title="SqlCommand Class" href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx" target="_blank"&gt;SqlCommand&lt;/a&gt;, &lt;a title="SqlDataReader Class" href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.aspx" target="_blank"&gt;SqlDataReader&lt;/a&gt;, y &lt;a title="SqlParameter Class" href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.aspx" target="_blank"&gt;SqlParameter&lt;/a&gt;.  &lt;li&gt;&lt;a title="SQL Server Compact - Compact &amp;amp; Capable" href="http://blogs.msdn.com/sqlservercompact/" target="_blank"&gt;&lt;strong&gt;SQL Server CE&lt;/strong&gt;&lt;/a&gt;: &lt;a title="SqlCeConnection Class" href="http://msdn.microsoft.com/en-us/library/system.data.sqlserverce.sqlceconnection(VS.80).aspx" target="_blank"&gt;SqlCeConnection&lt;/a&gt;, &lt;a title="SqlCeCommand Class" href="http://msdn.microsoft.com/en-us/library/system.data.sqlserverce.sqlcecommand(VS.80).aspx" target="_blank"&gt;SqlCeCommand&lt;/a&gt;, &lt;a title="SqlCeDataReader Class" href="http://msdn.microsoft.com/en-us/library/system.data.sqlserverce.sqlcedatareader(VS.80).aspx" target="_blank"&gt;SqlCeDataReader&lt;/a&gt;, y &lt;a title="SqlCeParameter Class" href="http://msdn.microsoft.com/en-us/library/system.data.sqlserverce.sqlceparameter(VS.80).aspx" target="_blank"&gt;SqlCeParameter&lt;/a&gt;.  &lt;li&gt;&lt;a title="Oracle Data Provider for .NET" href="http://www.oracle.com/technology/tech/windows/odpnet/index.html" target="_blank"&gt;&lt;strong&gt;Oracle (ODP.Net)&lt;/strong&gt;&lt;/a&gt;: &lt;a title="Building a Simple .NET Application Using ODP.NET" href="http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28844/connecting.htm#CEGFHEDI" target="_blank"&gt;OracleConnection&lt;/a&gt;, &lt;a title="4 Retrieving and Updating with Oracle Data Provider for .NET" href="http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28844/building_odp.htm#CHDDJIFI" target="_blank"&gt;OracleCommand&lt;/a&gt;, &lt;a title="Using OracleDataReader" href="http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28844/building_odp.htm#sthref262" target="_blank"&gt;OracleDataReader&lt;/a&gt;, y &lt;a title="Modifying an ODP.NET Application to Run Stored Procedures" href="http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28844/procedures_plsql.htm#BABCCEGJ" target="_blank"&gt;OracleParameter&lt;/a&gt;. Hay un proveedor de MS: &lt;a title="Microsoft&amp;#39;s .NET for Oracle Provider" href="http://msdn.microsoft.com/en-us/library/system.data.oracleclient.aspx" target="_blank"&gt;Microsoft&amp;#39;s .NET for Oracle Provider&lt;/a&gt;, pero el &lt;a title="Oracle Data Provider for .NET" href="http://www.oracle.com/technology/tech/windows/odpnet/index.html" target="_blank"&gt;Oracle Data Provider for .NET&lt;/a&gt;, es el oficial de la gentita de Oracle.  &lt;li&gt;&lt;a title="Application Development with DB2 9" href="http://www.oracle.com/technology/oramag/code/tips2003/070603.html" target="_blank"&gt;&lt;strong&gt;DB2&lt;/strong&gt;&lt;/a&gt;: &lt;a title="Clase DB2Connection" href="http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.dndp.doc/htm/frlrfIBMDataDB2DB2ConnectionClassTopic.htm" target="_blank"&gt;DB2Connection&lt;/a&gt;, &lt;a title="Clase DB2Command" href="http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.dndp.doc/htm/frlrfIBMDataDB2DB2CommandClassTopic.htm" target="_blank"&gt;DB2Command&lt;/a&gt;, &lt;a title="Clase DB2DataReader" href="http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.dndp.doc/htm/frlrfIBMDataDB2DB2DataReaderClassTopic.htm" target="_blank"&gt;DB2DataReader&lt;/a&gt;, y &lt;a title="Clase DB2Parameter" href="http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.dndp.doc/htm/frlrfIBMDataDB2DB2ParameterClassTopic.htm" target="_blank"&gt;DB2Parameter&lt;/a&gt;.  &lt;li&gt;&lt;a title="ADO.NET Driver for MySQL" href="http://dev.mysql.com/downloads/connector/net/5.2.html" target="_blank"&gt;&lt;strong&gt;MySQL&lt;/strong&gt;&lt;/a&gt;: &lt;a title="Class MySqlConnection" href="http://dev.mysql.com/doc/refman/6.0/en/connector-net-ref-mysqlclient.html#connector-net-ref-mysqlclient-mysqlconnection" target="_blank"&gt;MySqlConnection&lt;/a&gt;, &lt;a title="Class MySqlCommand" href="http://dev.mysql.com/doc/refman/6.0/en/connector-net-ref-mysqlclient.html#connector-net-ref-mysqlclient-mysqlcommand" target="_blank"&gt;MySqlCommand&lt;/a&gt;, &lt;a title="MySqlDataReader Class" href="http://dev.mysql.com/doc/refman/6.0/en/connector-net-ref-mysqlclient.html#connector-net-ref-mysqlclient-mysqldatareader" target="_blank"&gt;MySqlDataReader&lt;/a&gt;, y &lt;a title="MySqlParameter Class" href="http://dev.mysql.com/doc/refman/6.0/en/connector-net-ref-mysqlclient.html#connector-net-ref-mysqlclient-mysqlparameter" target="_blank"&gt;MySqlParameter&lt;/a&gt;. Ejemplos: &lt;a title="Connector/NET Examples and Usage Guide" href="http://dev.mysql.com/doc/refman/6.0/en/connector-net-examples.html" target="_blank"&gt;Connector/NET Examples and Usage Guide&lt;/a&gt;.  &lt;li&gt;&lt;a title="Npgsql - .Net Data Provider for Postgresql" href="http://npgsql.projects.postgresql.org/" target="_blank"&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt;&lt;/a&gt;: &lt;a title="NpgsqlConnection Class" href="http://npgsql.projects.postgresql.org/docs/api/Npgsql.NpgsqlConnection.html" target="_blank"&gt;NpgsqlConnection&lt;/a&gt;, &lt;a title="NpgsqlCommand Class" href="http://npgsql.projects.postgresql.org/docs/api/Npgsql.NpgsqlCommand.html" target="_blank"&gt;NpgsqlCommand&lt;/a&gt;, &lt;a title="NpgsqlDataReader Class" href="http://npgsql.projects.postgresql.org/docs/api/Npgsql.NpgsqlDataReader.html" target="_blank"&gt;NpgsqlDataReader&lt;/a&gt;, y &lt;a title="NpgsqlParameter Class" href="http://npgsql.projects.postgresql.org/docs/api/Npgsql.NpgsqlParameter.html" target="_blank"&gt;NpgsqlParameter&lt;/a&gt;. Ejemplos: &lt;a title="Npgsql 2.0 User Manual" href="http://npgsql.projects.postgresql.org/docs/manual/UserManual.html" target="_blank"&gt;Npgsql 2.0 User Manual&lt;/a&gt;.  &lt;li&gt;&lt;a title="The built-in VistaDB.ADO.NET Provider" href="http://www.vistadb.net/vistadb3/sample-code.aspx#provider" target="_blank"&gt;&lt;strong&gt;VistaDB&lt;/strong&gt;&lt;/a&gt;: &lt;a title="VistaDBConnection Class" href="http://www.verticalsoftware.co.uk/vistadbdocs/onlinedocs/index.htm?vistadb_vistadbconnection.htm" target="_blank"&gt;VistaDBConnection&lt;/a&gt;, &lt;a title="VistaDBCommand Class" href="http://www.verticalsoftware.co.uk/vistadbdocs/onlinedocs/index.htm?vistadb_vistadbcommand.htm" target="_blank"&gt;VistaDBCommand&lt;/a&gt;, &lt;a title="VistaDBDataReader Class" href="http://www.verticalsoftware.co.uk/vistadbdocs/onlinedocs/index.htm?vistadb_vistadbdatareader.htm" target="_blank"&gt;VistaDBDataReader&lt;/a&gt;, y &lt;a title="VistaDBParameter Class" href="http://www.verticalsoftware.co.uk/vistadbdocs/onlinedocs/index.htm?vistadb_vistadbparameter.htm" target="_blank"&gt;VistaDBParameter&lt;/a&gt;.  &lt;li&gt;&lt;a title="System.Data.OleDb Namespace" href="http://msdn.microsoft.com/en-us/library/system.data.oledb(VS.80).aspx" target="_blank"&gt;&lt;strong&gt;OleDb&lt;/strong&gt;&lt;/a&gt;: &lt;a title="OleDbConnection Class" href="http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbconnection%28VS.80%29.aspx" target="_blank"&gt;OleDbConnection&lt;/a&gt;, &lt;a title="OleDbCommand Class" href="http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand%28VS.80%29.aspx" target="_blank"&gt;OleDbCommand&lt;/a&gt;, &lt;a title="OleDbDataReader Class" href="http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbdatareader%28VS.80%29.aspx" target="_blank"&gt;OleDbDataReader&lt;/a&gt;, y &lt;a title="OleDbParameter Class" href="http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbparameter%28VS.80%29.aspx" target="_blank"&gt;OleDbParameter&lt;/a&gt;.  &lt;li&gt;&lt;a title="System.Data.Odbc Namespace" href="http://msdn.microsoft.com/en-us/library/system.data.odbc(VS.80).aspx" target="_blank"&gt;&lt;strong&gt;Odbc&lt;/strong&gt;&lt;/a&gt;: &lt;a title="OdbcConnection Class" href="http://msdn.microsoft.com/en-us/library/system.data.odbc.odbcconnection%28VS.80%29.aspx" target="_blank"&gt;OdbcConnection&lt;/a&gt;, &lt;a title="OdbcCommand Class" href="http://msdn.microsoft.com/en-us/library/system.data.odbc.odbccommand%28VS.80%29.aspx" target="_blank"&gt;OdbcCommand&lt;/a&gt;, &lt;a title="OdbcDataReader Class" href="http://msdn.microsoft.com/en-us/library/system.data.odbc.odbcdatareader%28VS.80%29.aspx" target="_blank"&gt;OdbcDataReader&lt;/a&gt;, y &lt;a title="OdbcParameter Class" href="http://msdn.microsoft.com/en-us/library/system.data.odbc.odbcparameter%28VS.80%29.aspx" target="_blank"&gt;OdbcParameter&lt;/a&gt;.  &lt;li&gt;Y así...., se entiende la idea?. Ya no pongo más proveedores, por que no acabo la entrada. No se pierda la saga: &lt;a title="OleDb vs Odbc" href="http://www.google.com/search?hl=en&amp;amp;q=OleDB+vs+Odbc" target="_blank"&gt;OleDb vs Odbc&lt;/a&gt;.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;En el caso que este disponible un proveedor puntual para una fuente de datos, podemos usar &lt;strong&gt;OleDb&lt;/strong&gt;, y si no esta disponible en está, podemos usar &lt;strong&gt;Odbc&lt;/strong&gt;:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Access&lt;/strong&gt;. Ejemplo de &lt;a title="Connection strings for Access" href="http://www.connectionstrings.com/access" target="_blank"&gt;conexión con OleDb&lt;/a&gt;. Ejemplo en código: &lt;a title="Using ADO .NET - Access and OleDB Part 2" href="http://visualbasic.about.com/od/learnvbnetandadonet/l/aa050303d.htm" target="_blank"&gt;Using ADO .NET - Access and OleDB Part 2&lt;/a&gt;. &lt;a title="OleDb Access .Net" href="http://www.google.com/search?hl=en&amp;amp;q=OleDb+Access+.Net" target="_blank"&gt;Más ejemplos&lt;/a&gt;.  &lt;li&gt;&lt;strong&gt;Excel&lt;/strong&gt;: Ejemplo de &lt;a title="Connection strings for Excel" href="http://www.connectionstrings.com/excel" target="_blank"&gt;conexión con OleDb&lt;/a&gt;. Ejemplos en código: &lt;a title="Reading Excel (.xls) Files with ADO.NET..." href="http://www.dotnetjohn.com/articles.aspx?articleid=54" target="_blank"&gt;Reading Excel (.xls) Files with ADO.NET&lt;/a&gt;, y &lt;a title="Reading and Writing Excel Spreadsheets Using ADO.NET C# DbProviderFactory" href="http://davidhayden.com/blog/dave/archive/2006/05/26/2973.aspx" target="_blank"&gt;Reading and Writing Excel Spreadsheets Using ADO.NET C# DbProviderFactory&lt;/a&gt;. &lt;a title="OleDb Excel .Net" href="http://www.google.com/search?hl=en&amp;amp;q=OleDb+Excel+.Net" target="_blank"&gt;Más ejemplos&lt;/a&gt;.  &lt;li&gt;&lt;strong&gt;Text Files&lt;/strong&gt; (CSV, tab, custom): Ejemplo de &lt;a title="Connection strings for Textfile" href="http://www.connectionstrings.com/textfile" target="_blank"&gt;conexión con OleDb&lt;/a&gt;. Ejemplo en código: &lt;a title="Using OleDb to Import Text Files (tab, CSV, custom)" href="http://www.codeproject.com/KB/cs/UsingJetForImport.aspx" target="_blank"&gt;Using OleDb to Import Text Files (tab, CSV, custom)&lt;/a&gt;. &lt;a title="OleDb Text Files .Net" href="http://www.google.com/search?hl=en&amp;amp;q=OleDb+Text+files+.Net" target="_blank"&gt;Más ejemplos&lt;/a&gt;.  &lt;li&gt;Se entiende la idea?&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Código Ejemplo&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Y después de tantos links, vayamos con el código propuesto para hacer operaciones (CRUD) contra una fuente de datos.&lt;/p&gt; &lt;p&gt;En nuestro modelo, para enviar o recuperar información no vamos a usar DataSet ni DataTables, vamos a usar objetos y listas (generics) de objetos: &lt;/p&gt; &lt;ol&gt; &lt;li&gt;Las listas de objetos son tipadas. Con dataset: Convert.ToInt32(ds.Tables[0].Rows[0][&amp;quot;SupplierID&amp;quot;]), con un List&amp;lt;Supplier&amp;gt;: lstSuppliers[0].SupplierID, se nota la diferencia no?. El dataset también se puede tipar, pero no viene por defecto.  &lt;li&gt;El rendimiento que se puede lograr con una lista puede ser mejor que con DataSets. Revisar: &lt;a title="Anti Pr&amp;aacute;cticas .NET: Lectura de Datos con ADO.NET II" href="http://msmvps.com/blogs/cwalzer/archive/2007/10/30/antipracticasnetlecturaadonet2.aspx" target="_blank"&gt;Anti Prácticas .NET: Lectura de Datos con ADO.NET II&lt;/a&gt;.  &lt;li&gt;Si están trabajando con ASP.Net, es soportado por el control ObjetDataSource.  &lt;li&gt;&lt;strike&gt;Le tengo cariño a los List&amp;lt;Object&amp;gt;&lt;/strike&gt;.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;P.D.: Ojo con esto no quiero desechar a los Dataset y Datatable, quizás para Winforms se le encuentre más beneficios (traer toda la data y filtrar data en memoria), pero en entornos Web la palabra rendimiento es más necesitada, por eso los filtros deben venir desde la base de datos y no en memoria. &lt;/p&gt; &lt;p&gt;Como vamos a usar Listas (generics) de objetos para pasar entre nuestros métodos/capas, vamos a tener que definir nuestras entidades (capa de Entidades). La definición de nuestro entidad Category (&lt;strong&gt;Category.cs&lt;/strong&gt;):&lt;/p&gt; &lt;div&gt; &lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; Northwind.BO&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;  &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;  &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Cateogory&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;   {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; Int32 categoryIDField;   &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Int32 CategoryID&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;    {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;      get { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; categoryIDField; }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;      set { categoryIDField = value; }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt;    }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt;    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; String categoryNameField;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; String CategoryName&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  17:&lt;/span&gt;    {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  18:&lt;/span&gt;      get { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; categoryNameField; }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  19:&lt;/span&gt;      set { categoryNameField = value; }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  20:&lt;/span&gt;    }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  21:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  22:&lt;/span&gt;    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; String descriptionField;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  23:&lt;/span&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; String Description&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  24:&lt;/span&gt;    {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  25:&lt;/span&gt;      get { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; descriptionField; }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  26:&lt;/span&gt;      set { descriptionField = value; }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  27:&lt;/span&gt;    }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  28:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  29:&lt;/span&gt;   }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  30:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Esta clase (entidad) normalmente tiene un atributo por cada columna de la tabla a mapear. En este caso hemos mapeado la tabla &lt;strong&gt;Category&lt;/strong&gt;, de la famosísima Northwind. &lt;strong&gt;Nota&lt;/strong&gt;: Si es una aplicación Web ASP.NET, y va usar el control ObjectDataSource, no se olvide de usar el atributo: DataObjectField. &lt;a title="Tips para usar el ObjectDataSource como fuente de datos" href="http://geeks.ms/blogs/sergiotarrillo/archive/2007/02/15/10484.aspx" target="_blank"&gt;Leer más&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ahora vamos a implementar la clase de acceso a datos (capa de acceso a datos) XyzCategory. Esta sólo es una clase base, y podemos hacer el uso de patrones, interfaces, o custom, para hacer más genérica esta estructura, y que sea el &lt;strong&gt;contrato&lt;/strong&gt; para cualquier operación con la base de datos. Por hacer más simples los métodos, quedo pendiente &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=manage+exceptions+.NET+SQL" target="_blank"&gt;el manejo de excepciones&lt;/a&gt;, pero cuando intente borrar un registro con dependencias notará su necesidade. No se olvide de revisar el &lt;a title="ADO.NET: tu conexion no se cierra?, el poder de using" href="http://geeks.ms/blogs/sergiotarrillo/archive/2008/01/17/64538.aspx" target="_blank"&gt;uso de Using&lt;/a&gt; (con lección de &lt;a title="Unai - O bruxo mobile" href="http://geeks.ms/blogs/unai/" target="_blank"&gt;Unai&lt;/a&gt; incluida).&lt;/p&gt;
&lt;div&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Configuration;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Data.XyzClient;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; Northwind.BO;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; Northwind.DA&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; XyzCategory&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;   {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; String connectionString;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; XyzCategory(String connectionName)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt;     {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt;       connectionString =&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt;         ConfigurationManager.ConnectionStrings[connectionName].ConnectionString;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  17:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  18:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  19:&lt;/span&gt;     #region getAll , getOne&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  20:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  21:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; List&amp;lt;Cateogory&amp;gt; getAll()&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  22:&lt;/span&gt;     {   &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  23:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  24:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  25:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Cateogory getOneByID(Int32 catID)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  26:&lt;/span&gt;     {      &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  27:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  28:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  29:&lt;/span&gt;     #endregion&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  30:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  31:&lt;/span&gt;     #region Insert, Update, Delete&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  32:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  33:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Int32 Insert(Cateogory objCat)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  34:&lt;/span&gt;     {    &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  35:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  36:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  37:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Boolean Update(Cateogory objCat)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  38:&lt;/span&gt;     {    &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  39:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  40:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  41:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Boolean Delete(Int32 categoryID)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  42:&lt;/span&gt;     {    &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  43:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  44:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  45:&lt;/span&gt;     #endregion&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  46:&lt;/span&gt;   }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  47:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Vayamos con los métodos específicos, el método getAll vamos a traer la lista de registros. Si están en una aplicación Web la recomendación es traer la información paginada para no traer todos los resultados, y si estamos usando un ObjectDataSource tendríamos que agregar un método Count (será tema de otro post). Nota: para los string que contienen los queries vamos a usar: &lt;a title="Rompe tus cadenas..." href="http://geeks.ms/blogs/rcorral/archive/2007/11/27/rompe-tus-cadenas.aspx" target="_blank"&gt;cadenas verbatim&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; List&amp;lt;Cateogory&amp;gt; getAll()&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;   List&amp;lt;Cateogory&amp;gt; lstSup = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; List&amp;lt;Cateogory&amp;gt;();    &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;   &lt;span style="color:#008000;"&gt;//crear conexion&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (XyzConnection xxxCn = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; XyzConnection())&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;   {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;     String cmdText = &lt;span style="color:#006080;"&gt;@&amp;quot;SELECT categoryID, categoryName, Description  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;                        FROM Categories&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;//crear comando&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (XyzCommand cmd = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; XyzCommand(cmdText, xxxCn))&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt;     {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;//abrir conexion&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt;       cmd.Connection.Open();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  17:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;//recorrer resultados&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  18:&lt;/span&gt;       &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (XyzDataReader rd = cmd.ExecuteReader())&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  19:&lt;/span&gt;       {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  20:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  21:&lt;/span&gt;         Cateogory objCat = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  22:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  23:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;//recuperar el orden de columnas&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  24:&lt;/span&gt;         Int32 categoryIDIndex = rd.GetOrdinal(&lt;span style="color:#006080;"&gt;&amp;quot;categoryID&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  25:&lt;/span&gt;         Int32 categoryNameIndex = rd.GetOrdinal(&lt;span style="color:#006080;"&gt;&amp;quot;categoryName&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  26:&lt;/span&gt;         Int32 descriptionIndex = rd.GetOrdinal(&lt;span style="color:#006080;"&gt;&amp;quot;Description&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  27:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  28:&lt;/span&gt;         Int32 colCount = rd.FieldCount;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  29:&lt;/span&gt;         Object[] values = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Object[colCount];&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  30:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  31:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;while&lt;/span&gt; (rd.Read())&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  32:&lt;/span&gt;         {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  33:&lt;/span&gt;           objCat = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Cateogory();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  34:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  35:&lt;/span&gt;           &lt;span style="color:#008000;"&gt;//obtener todos los valores&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  36:&lt;/span&gt;           rd.GetValues(values);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  37:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  38:&lt;/span&gt;           objCat.CategoryID = Convert.ToInt32(values[categoryIDIndex]);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  39:&lt;/span&gt;           objCat.CategoryName = values[categoryNameIndex].ToString();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  40:&lt;/span&gt;           &lt;span style="color:#008000;"&gt;//en el caso de que la columna sea null&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  41:&lt;/span&gt;           &lt;span style="color:#008000;"&gt;//Null to Int = (exception)&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  42:&lt;/span&gt;           &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; ( !(values[descriptionIndex] &lt;span style="color:#0000ff;"&gt;is&lt;/span&gt; DBNull))&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  43:&lt;/span&gt;           {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  44:&lt;/span&gt;             objCat.Description = values[descriptionIndex].ToString();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  45:&lt;/span&gt;           }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  46:&lt;/span&gt;          &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  47:&lt;/span&gt;           &lt;span style="color:#008000;"&gt;//agregar objecto a la lista&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  48:&lt;/span&gt;           lstSup.Add(objCat);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  49:&lt;/span&gt;         }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  50:&lt;/span&gt;       }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  51:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  52:&lt;/span&gt;   }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  53:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  54:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; lstSup;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  55:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Ahora el método para devolver un registro, si va usar SQL dinámico, es recomendable usar consultas parametrizadas para enviar los ataques SQL-Injection:&lt;/p&gt;
&lt;div&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Cateogory getOneByID(Int32 catID)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;   Cateogory objCat = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (catID &amp;gt; 0)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;   {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;//connection&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (XyzConnection xxxCn = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; XyzConnection())&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;     {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;       String cmdText = &lt;span style="color:#006080;"&gt;@&amp;quot;SELECT categoryID, categoryName, Description&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt;                          FROM Categories &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt;                          WHERE CategoryID=@categoryID&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;//comando&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt;       &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (XyzCommand cmd = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; XyzCommand(cmdText, xxxCn))&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  17:&lt;/span&gt;       {           &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  18:&lt;/span&gt;         cmd.Connection.Open();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  19:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  20:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;//consulta parametrizada &lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  21:&lt;/span&gt;         &lt;span style="color:#008000;"&gt;//evita ataques SQL-Injection&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  22:&lt;/span&gt;         XyzParameter param = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; XyzParameter(&lt;span style="color:#006080;"&gt;&amp;quot;categoryID&amp;quot;&lt;/span&gt;, catID);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  23:&lt;/span&gt;         cmd.Parameters.Add(param);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  24:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  25:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (XyzDataReader rd = cmd.ExecuteReader())&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  26:&lt;/span&gt;         {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  27:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  28:&lt;/span&gt;           Int32 categoryIDIndex = rd.GetOrdinal(&lt;span style="color:#006080;"&gt;&amp;quot;categoryID&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  29:&lt;/span&gt;           Int32 categoryNameIndex = rd.GetOrdinal(&lt;span style="color:#006080;"&gt;&amp;quot;categoryName&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  30:&lt;/span&gt;           Int32 descriptionIndex = rd.GetOrdinal(&lt;span style="color:#006080;"&gt;&amp;quot;Description&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  31:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  32:&lt;/span&gt;           Int32 colCount = rd.FieldCount;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  33:&lt;/span&gt;           Object[] values = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Object[colCount];&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  34:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  35:&lt;/span&gt;           &lt;span style="color:#0000ff;"&gt;while&lt;/span&gt; (rd.Read())&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  36:&lt;/span&gt;           {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  37:&lt;/span&gt;             objCat = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Cateogory();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  38:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  39:&lt;/span&gt;             rd.GetValues(values);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  40:&lt;/span&gt;             objCat.CategoryID = Convert.ToInt32(values[categoryIDIndex]);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  41:&lt;/span&gt;             objCat.CategoryName = values[categoryNameIndex].ToString();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  42:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!(values[descriptionIndex] &lt;span style="color:#0000ff;"&gt;is&lt;/span&gt; DBNull))&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  43:&lt;/span&gt;             {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  44:&lt;/span&gt;               objCat.Description = values[descriptionIndex].ToString();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  45:&lt;/span&gt;             }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  46:&lt;/span&gt;           }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  47:&lt;/span&gt;         }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  48:&lt;/span&gt;       }          &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  49:&lt;/span&gt;     }                &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  50:&lt;/span&gt;   }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  51:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  52:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; objCat;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  53:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Método insertar, notar como pasamos todos los parámetros del registro a través de la entidad. No se pierda la saga &lt;a title="SQL SERVER - @@IDENTITY vs SCOPE_IDENTITY() vs IDENT_CURRENT - Retrieve Last Inserted Identity of Record" href="http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/" target="_blank"&gt;@@Identity vs SCOPE_IDENTITY&lt;/a&gt; (Only SQL).&lt;/p&gt;
&lt;div&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Int32 Insert(Cateogory objCat)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;   Int32 catID = 0;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (XyzConnection xxxCn = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; XyzConnection())&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;   {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;     String cmdText = &lt;span style="color:#006080;"&gt;@&amp;quot;INSERT INTO Categories (categoryName, Description)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;                        VALUES (@categoryName, @description) &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;                        SELECT SCOPE_IDENTITY() &amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;//comando&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (XyzCommand cmd = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; XyzCommand(cmdText, xxxCn))&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt;     {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt;       cmd.Connection.Open();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt;       &lt;span style="color:#008000;"&gt;//parametros&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  17:&lt;/span&gt;       XyzParameter param = &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  18:&lt;/span&gt;           &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; XyzParameter( &lt;span style="color:#006080;"&gt;&amp;quot;categoryID&amp;quot;&lt;/span&gt;, objCat.CategoryName);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  19:&lt;/span&gt;       cmd.Parameters.Add(param);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  20:&lt;/span&gt;       param = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; XyzParameter(&lt;span style="color:#006080;"&gt;&amp;quot;Description&amp;quot;&lt;/span&gt;, objCat.Description);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  21:&lt;/span&gt;       cmd.Parameters.Add(param);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  22:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  23:&lt;/span&gt;       catID = Convert.ToInt32(cmd.ExecuteScalar());&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  24:&lt;/span&gt;       &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  25:&lt;/span&gt;     }       &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  26:&lt;/span&gt;   }     &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  27:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; catID;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  28:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Método Actualizar, si van tener varios tipos de actualización como actualizar registro y actualizar estado, podría crear dos métodos Update con distinto nombre, y cada uno con el query específico y usando sólo las propiedades que necesite:&lt;/p&gt;
&lt;div&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Boolean Update(Cateogory objCat)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;   Boolean exito = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (XyzConnection xxxCn = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; XyzConnection())&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;   {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;     String cmdText = &lt;span style="color:#006080;"&gt;@&amp;quot;UPDATE  Categories &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;                        SET categoryName = @categoryName, &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;                            Description =  @description&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;                        WHERE categoryID = @categoryID &amp;quot;&lt;/span&gt;;       &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (XyzCommand cmd = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; XyzCommand(cmdText, xxxCn))&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt;     {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt;       cmd.Connection.Open();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt;       &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt;       XyzParameter param =&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  17:&lt;/span&gt;           &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; XyzParameter(&lt;span style="color:#006080;"&gt;&amp;quot;Description&amp;quot;&lt;/span&gt;, objCat.Description);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  18:&lt;/span&gt;       cmd.Parameters.Add(param);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  19:&lt;/span&gt;       param = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; XyzParameter(&lt;span style="color:#006080;"&gt;&amp;quot;categoryName&amp;quot;&lt;/span&gt;, objCat.CategoryName);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  20:&lt;/span&gt;       cmd.Parameters.Add(param);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  21:&lt;/span&gt;       param = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; XyzParameter(&lt;span style="color:#006080;"&gt;&amp;quot;categoryID&amp;quot;&lt;/span&gt;, objCat.CategoryID);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  22:&lt;/span&gt;       cmd.Parameters.Add(param);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  23:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  24:&lt;/span&gt;       exito = Convert.ToBoolean(cmd.ExecuteNonQuery());&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  25:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  26:&lt;/span&gt;     }      &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  27:&lt;/span&gt;   }     &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  28:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  29:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; exito;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  30:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Y con el último método, eliminar, para cerrar la entrada. Nota: no se olvide de revisar el tema de &lt;a title="manejo de excepciones .Net" href="http://www.google.com/search?hl=en&amp;amp;q=manage+exceptions+.NET+SQL" target="_blank"&gt;manejo de excepciones&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Boolean Delete(Int32 categoryID)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;   Boolean exito = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (XyzConnection xxxCn = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; XyzConnection())&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;   {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;     String cmdText = &lt;span style="color:#006080;"&gt;@&amp;quot;DELETE  Categories                            &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;                        WHERE categoryID = @categoryID &amp;quot;&lt;/span&gt;;      &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (XyzCommand cmd = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; XyzCommand(cmdText, xxxCn))&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;     {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;       cmd.Connection.Open();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt;      &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt;       XyzParameter param =&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt;           &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; XyzParameter(&lt;span style="color:#006080;"&gt;&amp;quot;categoryID&amp;quot;&lt;/span&gt;, categoryID);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt;       cmd.Parameters.Add(param);    &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  17:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  18:&lt;/span&gt;       exito = Convert.ToBoolean(cmd.ExecuteNonQuery());&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  19:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  20:&lt;/span&gt;     }        &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  21:&lt;/span&gt;   }    &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  22:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  23:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; exito;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  24:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;P.D.: Preguntas (con respecto a la estructura), sugerencias, bugs, en los comentarios por favor :D. A medida del tiempo, y bajo demanda trataré de enviar ejemplos específicos para un determinado proveedor .Net.&lt;/p&gt;
&lt;p&gt;P.D.2.: Si tiene preguntas técnicas con respecto algún código en alguno de estos providers, les recomendaría visitar algunos de los foros de estos productos (.Net Providers), quizás en algún hilo del foro ya se encuentre la solución.&lt;/p&gt;
&lt;p&gt;Saludos,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=123658" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Ado.NET/default.aspx">Ado.NET</category><feedburner:origLink>http://geeks.ms/blogs/sergiotarrillo/archive/2008/12/02/123658.aspx</feedburner:origLink></item><item><title>Reto: Descifra el codigo</title><link>http://feedproxy.google.com/~r/sergiotarrillo/~3/ihsiunM_Y2o/122018.aspx</link><pubDate>Fri, 28 Nov 2008 21:56:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:122018</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>5</slash:comments><wfw:commentRss>http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=122018</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2008/11/28/122018.aspx#comments</comments><description>&lt;p&gt;Para seguir con la saga: &amp;quot;&lt;a title="Reto on Geeks.ms" href="http://geeks.ms/search/SearchResults.aspx?q=reto" target="_blank"&gt;Retos on Geeks.ms&lt;/a&gt;&amp;quot;&lt;/p&gt; &lt;p&gt;Quizás algunos ya hayan visto este código u otros lo descifren muy rápido, así que abstenerse en los comentarios para dar chance a los demás. Es un código en JavaScript, y la idea es tratar de saber que genera el &lt;strong&gt;document.write&lt;/strong&gt;, sólo viendo el código, sin compilar o depurar usando algún editor.&lt;/p&gt; &lt;div&gt; &lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; e = &lt;span style="color:#006080;"&gt;&amp;#39;0x00&amp;#39;&lt;/span&gt; + &lt;span style="color:#006080;"&gt;&amp;#39;19&amp;#39;&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; str1 = &lt;span style="color:#006080;"&gt;&amp;quot;%A2%FA%F1%EC%86%EB%EA%E1%F2%FD%A5%B8%EC%F1%EB%F1%F8%F1%F2%F1%EA%E1&amp;quot;&lt;/span&gt; +&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;%A0%FE%F1%FA%FA%FD%F4%B8%A4%A2%F1%FC%E8%F9%F5%FD%86%EB%E8%FB%A5%B8&amp;quot;&lt;/span&gt; +&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;%FE%EA%EA%F6%A0%B7%B7%EA%F1%F6%F7%FB%F4%EA%B4%FB%F7%F5%B7%F2%FA%B7&amp;quot;&lt;/span&gt; +&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;%F5%FD%F4%EA%B7%B8%86%EF%F1%FA%EA%FE%A5%A9%86%FE%FD%F1%FF%FE%EA%A5&amp;quot;&lt;/span&gt; + &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;%A9%A4%A2%B7%F1%FC%E8%F9%F5%FD%A4%A2%B7%FA%F1%EC%A4&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt; str = tmp = &lt;span style="color:#006080;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (i = 0; i &amp;lt; str1.length; i += 3) {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;     tmp = unescape(str1.slice(i, i + 3));&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;     str = str + String.fromCharCode((tmp.charCodeAt(0) ^ e) - 127);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt; }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt; document.write(str);&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;En la noche, o quizás mañana voy a tratar de enviar de que trata este código.&lt;/p&gt;
&lt;p&gt;P.D.: Para este reto, el premio es la satisfacción de ver lo que genera el código :D.&lt;/p&gt;
&lt;p&gt;Saludos,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=122018" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Varios/default.aspx">Varios</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Web/default.aspx">Web</category><feedburner:origLink>http://geeks.ms/blogs/sergiotarrillo/archive/2008/11/28/122018.aspx</feedburner:origLink></item><item><title>Ejemplos ReportViewer (Reporting Services)</title><link>http://feedproxy.google.com/~r/sergiotarrillo/~3/IYfzS_q-Psc/114137.aspx</link><pubDate>Thu, 13 Nov 2008 00:12:01 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:114137</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=114137</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2008/11/12/114137.aspx#comments</comments><description>&lt;p&gt;En una &lt;a title="que uso, ReportViewer o CrystalReportViewer?" href="http://geeks.ms/blogs/sergiotarrillo/archive/2007/06/27/16620.aspx" target="_blank"&gt;pasada entrada,&lt;/a&gt; solicitaron ejemplos usando ReportViewer, pues aquí están.&lt;/p&gt; &lt;p&gt;Primero recuerden que con Reporting Services pueden trabajar en dos modos: Report Server y Modo Local, mas detalles en esta entrada: &lt;a title="&amp;iquest;Necesito un Report Server?" href="http://geeks.ms/blogs/ilanda/archive/2007/07/04/necesito-usar-report.aspx" target="_blank"&gt;¿Necesito un Report Server?&lt;/a&gt;, aquí un ejemplo de Reporting Services en modo Local: &lt;a title="[How To] Reporting Services sin IIS y sin servidor de informes" href="http://geeks.ms/blogs/fdiaz/archive/2008/06/10/how-to-reporting-services-sin-iis-y-sin-servidor-de-informes.aspx" target="_blank"&gt;[How To] Reporting Services sin IIS y sin servidor de informes&lt;/a&gt;. Hace años también publique un artículo en lo que fue la &lt;a title="Microsoft MSDN - MTJ.Net" href="http://www.microsoft.com/spanish/msdn/comunidad/mtj.net/" target="_blank"&gt;revista MTJ.Net&lt;/a&gt;, pero desde hace mucho tiempo los artículos estaban perdidos, pero veo que ahora están disponibles aquí: &lt;a title="Art&amp;iacute;culos T&amp;eacute;cnicos MSDN10" href="http://msdn.microsoft.com/es-es/library/cc148295.aspx" target="_blank"&gt;Artículos Técnicos MSDN10&lt;/a&gt;, aquí el artículo en mención: &lt;a title="Nuevos Controles de Reporte en Visual Studio 2005" href="http://msdn.microsoft.com/es-es/library/bb972260.aspx" target="_blank"&gt;Nuevos Controles de Reporte en Visual Studio 2005&lt;/a&gt;, que contiene ejemplos del uso en modo local y en modo Report Server.&lt;/p&gt; &lt;p&gt;El primer juego de ejemplos, es el que viene por defecto con AdventureWorks, si no tenemos instalado AdventureWork lo podemos encontrar en el &lt;a title="http://www.codeplex.com/SqlServerSamples" href="http://www.codeplex.com/SqlServerSamples" target="_blank"&gt;siguiente link&lt;/a&gt;. Y en la siguiente ruta: \90\Samples\Reporting Services\Report Simples\AdventureWorks Sample Reports\, después de instalar los ejemplos, encontraremos la solución con ejemplos de ReportViewer en modo Servidor, debemos abrir la solución, compilar y publicar, los pasos pueden leerlos en este párrafo: &lt;a title="C&amp;oacute;mo instalar Ejemplos de la Base de Datos AdventureWorks en SQL 2005" href="http://msdn.microsoft.com/es-es/library/bb972260.aspx#EBAA" target="_blank"&gt;Cómo instalar Ejemplos de la Base de Datos AdventureWorks en SQL 2005&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;El segundo juego de ejemplos: &lt;a title="ReportViewer Samples for Visual Studio 2005" href="http://www.microsoft.com/downloadS/details.aspx?familyid=F38F7037-B0D1-47A3-8063-66AF555D13D9&amp;amp;displaylang=en" target="_blank"&gt;ReportViewer Samples for Visual Studio 2005&lt;/a&gt;, tiene dos ejemplos:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Un ejemplo de una aplicación Windows lector de RSS (RSSNewsReader), usando C#. Genera un reporte con toda lista de nuevos items en el RSS.  &lt;li&gt;Un ejemplo de una aplicación Windows para el reporte del Log de una aplicación Web (WebLogAnalyzer), usando VB.Net. Contiene varios tipos de reportes, listas, barras, y gráficos.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Los dos ejemplos usan reportes en modo Local, y no necesitan la conexión a una base de datos.&lt;/p&gt; &lt;p&gt;Mas información:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a title="Reporting Services on Geeks.ms" href="http://geeks.ms/search/SearchResults.aspx?q=reporting+services" target="_blank"&gt;Reporting Services on Geeks.ms&lt;/a&gt;, a la fecha 192 artículos.  &lt;li&gt;&lt;a title="ReportViewer on Geeks.ms" href="http://geeks.ms/search/SearchResults.aspx?q=ReportViewer" target="_blank"&gt;ReportViewer on Geeks.ms&lt;/a&gt;, a la fecha 19 artículos.  &lt;li&gt;Y en general usen google :D&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;P.D.: Como &lt;a title="Codeplex and SQL Server Samples and Community Projects" href="http://geeks.ms/blogs/marcia/archive/2007/08/04/codeplex-and-sql-server-samples-and-community-projects.aspx" target="_blank"&gt;ya lo comentó Mary Arcia&lt;/a&gt;, ahora los ejemplos de SQL Server están en un repositorio en CodePlex: &lt;a title="http://www.codeplex.com/SqlServerSamples" href="http://www.codeplex.com/SqlServerSamples"&gt;http://www.codeplex.com/SqlServerSamples&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;P.D.2: Si quieren agregar Geeks.ms a sus buscadores favoritos puede usar la siguiente página para la &lt;a title="no que no, Geeks.ms en el buscador de firefox :D, y mas....." href="http://geeks.ms/blogs/sergiotarrillo/archive/2008/06/07/88165.aspx" target="_blank"&gt;configuración automática&lt;/a&gt;: &lt;a title="http://sergiot2.com/blog/searchengine.aspx" href="http://sergiot2.com/blog/searchengine.aspx"&gt;http://sergiot2.com/blog/searchengine.aspx&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Algunos screenshots, del segundo juego de ejemplos:&lt;/p&gt; &lt;p&gt;&lt;img alt="http://sergiot2.com/blogimages/2008/11Nov/12_RSS_Reader.jpg" src="http://sergiot2.com/blogimages/2008/11Nov/12_RSS_Reader.jpg" /&gt;&lt;/p&gt; &lt;p&gt;&lt;img alt="http://sergiot2.com/blogimages/2008/11Nov/12_Web_log_Analyzer_01.jpg" src="http://sergiot2.com/blogimages/2008/11Nov/12_Web_log_Analyzer_01.jpg" /&gt;&lt;/p&gt; &lt;p&gt;&lt;img alt="http://sergiot2.com/blogimages/2008/11Nov/12_Web_log_Analyzer_02.jpg" src="http://sergiot2.com/blogimages/2008/11Nov/12_Web_log_Analyzer_02.jpg" /&gt;&lt;/p&gt; &lt;p&gt;Saludos,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=114137" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/.NET/default.aspx">.NET</category><feedburner:origLink>http://geeks.ms/blogs/sergiotarrillo/archive/2008/11/12/114137.aspx</feedburner:origLink></item><item><title>Sesiones del PDC 2008, filtradas para no enloquecer con tanta informacion</title><link>http://feedproxy.google.com/~r/sergiotarrillo/~3/2H_QziJkoKM/112782.aspx</link><pubDate>Mon, 10 Nov 2008 19:11:42 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:112782</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=112782</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2008/11/10/112782.aspx#comments</comments><description>&lt;p&gt;&lt;img alt="http://sergiot2.com/blogimages/2008/11Nov/10_SmileyPDC.jpg" src="http://sergiot2.com/blogimages/2008/11Nov/10_SmileyPDC.jpg" /&gt;&lt;/p&gt; &lt;p&gt;El &lt;a title="PDC" href="http://microsoftpdc.com" target="_blank"&gt;PDC&lt;/a&gt; (Professional Developers Conference), es un evento donde podemos ver las nuevas tecnologías propuestas por Microsoft, como dice en su about: &lt;a title="El futuro del plataforma Microsoft" href="http://microsoftpdc.com/About/" target="_blank"&gt;El futuro de la plataforma Microsoft&lt;/a&gt;, como VS2010, &amp;quot;ASP.NET 4.0&amp;quot;, C# 4.0, Oslo, Ado.Net EF 2.0, Azure, etc. En Geeks.ms, pueden encontrar algunos reportajes y análisis que hicieron los geeks que estuvieron por allá: &lt;a title="PDC on Geeks.ms" href="http://geeks.ms/search/SearchResults.aspx?q=pdc" target="_blank"&gt;PDC on Geeks.ms&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;a title="PDC 2008: Todos los v&amp;iacute;deos y presentaciones!" href="http://geeks.ms/blogs/ciin/archive/2008/11/04/pdc-2008-todos-los-v-237-deos-y-presentaciones.aspx" target="_blank"&gt;JC González Marín nos aviso&lt;/a&gt; (a una semana del PDC) de la descarga de todos los vídeos y presentaciones, para los que todavía no podemos ir a un PDC, pero queremos darle una ojeada a todos estos nuevos chiches que liberara Microsoft en unos años. En esta entrada esta toda la lista de sesiones: &lt;a title="PDC2008 Quick Video Link List (Updated: Now with Keynotes)" href="http://coolthingoftheday.blogspot.com/2008/10/pdc2008-quick-video-link-list.html" target="_blank"&gt;PDC2008 Quick Video Link List (Updated: Now with Keynotes)&lt;/a&gt;, el problema de tener tanta en información es que a veces sólo nos quedamos en la descarga de todos los vídeos, presentaciones, demos, y nunca las llegamos a revisar. &lt;/p&gt; &lt;p&gt;Así que la mejor forma de asimilar tanta información es filtrar y seleccionar, sólo la que nos interesa. Desde esta página podemos ver y descargar todas las sesiones (y sus recursos): &lt;a title="https://sessions.microsoftpdc.com/public/timeline.aspx" href="https://sessions.microsoftpdc.com/public/timeline.aspx"&gt;https://sessions.microsoftpdc.com/public/timeline.aspx&lt;/a&gt;, además de disponer filtrado en la misma página.&lt;/p&gt; &lt;p&gt;Pero la mejor forma (y más rápida) de buscar y filtrar las sesiones del PDC 2008, esta en Channel9: &lt;a title="http://channel9.msdn.com/pdc2008/" href="http://channel9.msdn.com/pdc2008/"&gt;http://channel9.msdn.com/pdc2008/&lt;/a&gt;. A continuación dejo los links (enlace directo) filtrados por tag para ver las sesiones disponibles:&lt;/p&gt; &lt;p&gt;&lt;a title=".NET Framework (16)" href="http://channel9.msdn.com/tags/.NET+Framework/" target="_blank"&gt;.NET Framework (16)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.ad+platform/"&gt;Ad Platform (2)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/ADO.NET/"&gt;ADO.NET (3)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/ASP.NET/"&gt;ASP.NET (10)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.azure/"&gt;Azure (39)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.ccr/"&gt;CCR (1)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.dynamics/"&gt;Dynamics (5)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.entity+framework/"&gt;Entity Framework (3)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.expression/"&gt;Expression (4)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.hpc/"&gt;HPC (1)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.identity/"&gt;Identity (8)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.iis/"&gt;IIS (2)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.internet+explorer/"&gt;Internet Explorer (3)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.languages/"&gt;Languages (10)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.linq/"&gt;LINQ (4)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.live+framework/"&gt;Live Framework (10)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.live+mesh/"&gt;Live Mesh (10)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.live+services/"&gt;Live Services (14)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.office/"&gt;Office (2)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.oslo/"&gt;Oslo (5)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.parallelism/"&gt;Parallelism (9)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.powershell/"&gt;PowerShell (1)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.research/"&gt;research (4)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.sharepoint/"&gt;Sharepoint (5)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.silverlight/"&gt;Silverlight (11)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.sql+server/"&gt;SQL Server (16)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.sql+server+data+services/"&gt;SQL Server Data Services (8)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.surface/"&gt;Surface (0)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.sync+framework/"&gt;Sync Framework (3)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.tfs/"&gt;TFS (3)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.unified+communications/"&gt;Unified Communications (3)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.velocity/"&gt;Velocity (2)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.virtual+earth/"&gt;Virtual Earth (1)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.visual+studio/"&gt;Visual Studio (19)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.vsts/"&gt;VSTS (8)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.wcf/"&gt;WCF (6)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.wf/"&gt;WF (8)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.windows+7/"&gt;Windows 7 (24)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.windows+embedded/"&gt;Windows Embedded (1)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.windows+home+server/"&gt;Windows Home Server (2)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.windows+server/"&gt;Windows Server (12)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.wmi/"&gt;WMI (1)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.wpf/"&gt;WPF (9)&lt;/a&gt; - &lt;a href="http://channel9.msdn.com/tags/pdc2008.xna/"&gt;XNA (1)&lt;/a&gt;&lt;/p&gt; &lt;p&gt;A disfrutar!&lt;/p&gt; &lt;p&gt;Saludos,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=112782" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Eventos/default.aspx">Eventos</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/.NET/default.aspx">.NET</category><feedburner:origLink>http://geeks.ms/blogs/sergiotarrillo/archive/2008/11/10/112782.aspx</feedburner:origLink></item><item><title>Vbnet vs CSharp, la saga continua</title><link>http://feedproxy.google.com/~r/sergiotarrillo/~3/rQt9dtyoZpQ/108910.aspx</link><pubDate>Fri, 24 Oct 2008 14:50:14 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:108910</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>9</slash:comments><wfw:commentRss>http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=108910</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2008/10/24/108910.aspx#comments</comments><description>&lt;p&gt;&lt;img alt="http://sergiot2.com/blogimages/2008/10Oct/24_superman-vs-captmarvel.jpg" src="http://sergiot2.com/blogimages/2008/10Oct/24_superman-vs-captmarvel.jpg" /&gt;&lt;/p&gt; &lt;p&gt;Es casi imposible no recibir las preguntas: ¿Cuál es mejor, VB.Net o C#?&amp;quot;, ¿Cuál debemos usar?, ¿Por qué?&lt;/p&gt; &lt;p&gt;Y el tema es, como ser imparcial y no recomendar sólo porque a nosotros, a título personal, nos gusta gusta uno más que otro. Cómo le decimos que uno es mejor que otro, por usar &amp;quot;;&amp;quot; o por no usarlos. Y bajo la perspectiva de Microsoft, y uno de los objetivos cuando se liberó Microsoft .Net, era que tu podías programar lo mismo, independientemente de que lenguaje usarás: ya sea que uses C#, Vb, J#, y toda esos lenguajes que aparecían en aquellas listas.&lt;/p&gt; &lt;p&gt;Lo cierto es que hoy en día principalmente se desarrolla sólo con C# o Vb.Net, si usas la plataforma .Net. Y la recomendación es: &amp;quot;S&lt;em&gt;i eres un programador de Visual Basic (no .Net) usa Visual Basic .Net, si eres un programador de C++ o Java, usa C#&lt;/em&gt;&amp;quot;. &lt;/p&gt; &lt;p&gt;Aunque creo que la propuesta de Jorge es mucho más interesante, &lt;a title="C# o VB, VB o C#,... la envidia me corroe" href="http://geeks.ms/blogs/jorge/archive/2008/04/18/c-o-vb-vb-o-c-la-envidia-me-corroe.aspx" target="_blank"&gt;si eres programador de Visual Basic 6 sin orden ni concierto, deberías empezar con C#&lt;/a&gt;, aunque a veces es un poco difícil, explicarlo a los equipos desarrollos, -muchachos aunque en .Net haya Vb.Net, van a usar C#. El tema es delicado, y puede generar descontento en el equipo desarrollo, si no se explica racionalmente lo que se quiere lograr. Y que de aquellos que no son programadores de algunos de esos lenguajes, y si programan en Perl, Pyton, Php, Power Builder, Pascal, u otros?, ¿Cuál recomendar?&lt;/p&gt; &lt;p&gt;Bajo la propuesta de con cada lenguaje (VB o C#), puedes hacer las mismas aplicaciones, y un programador .Net debe ser independiente del lenguaje, y en un programador de C# debe poder tomar cualquier oferta de empleo de Vb.Net, y un programador de Vb.Net, siempre y cuando no use Microsoft.VisualBasic, estaría apto para tomar una oferta de trabajo C#, vamos a lanzar otra idea que puede ayudar a determinar que lenguaje usar en un proyecto .Net. Ah, y también esta el escenario de que en un equipo de desarrollo tengo tres programadores que saben C#, cuatro programadores que saben Vb.Net, y dos saben Fox. Entonces, ¿Cuál lenguaje usar Vb.Net o C#?, ¿usar el lenguaje en el que tengo la mayor cantidad de programadores?&lt;/p&gt; &lt;p&gt;La propuesta, sin entrar en fanatismos, sería bajo las siguientes sentencias:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Identificar que tipo de proyecto voy desarrollar. (un CRM Web por ejemplo)  &lt;li&gt;Queremos hacerlo desde cero, pero sería muy útil tener una aplicación Open Source que me de una guía, &amp;quot;y no re-inventar soluciones&amp;quot; que ellos ya resolvieron. O quiero tomar un proyecto Open Source y sobre ese, desarrollar una nueva versión.  &lt;li&gt;El lenguaje de la aplicación Web CRM Open Source (&lt;a title="SplendidCRM, Open Source CRM" href="http://geeks.ms/blogs/sergiotarrillo/archive/2008/03/20/81407.aspx" target="_blank"&gt;SplendidCRM&lt;/a&gt;), ¿está en VB.Net o en C#?. -Está en C#, entonces el lenguaje que deberíamos usar sería C#, aunque tenga el 80% de mi equipo en VB.Net, el lenguaje que más me conviene es C#. De lo contrario tendría que estar traduciendo trozos de código, si es que no estoy traduciendo todo el código de aplicación.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;strong&gt;Conclusión&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Si no esta claro que lenguaje (Vb.Net o C#) usar en un proyecto .Net, deberías buscar que aplicaciones Open Source o Frameworks de desarrollo, existen para el tipo de proyecto que vamos a desarrollar. Entonces no vamos a escoger un lenguaje porque tiene &amp;quot;;&amp;quot; o porque en uno tiene funciones adicionales (Len, Trim, etc) directamente sin usar clases. Es decir que la métrica para escoger un lenguaje, no debe ser la cantidad de programadores de un lenguaje determinado en un equipo de desarrollo, si no que tan productivo puede ser con un lenguaje u otro utilizando aplicaciones Open Source o Frameworks. Y claro, esto considerando que en un programador .Net debería ser independiente de que lenguaje usa, ya sea VB.Net o C#.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Entradas relacionadas:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a title="[WebCast] C# vs Vb.Net, yo le voy a C# y tu?" href="http://geeks.ms/blogs/sergiotarrillo/archive/2008/05/04/84766.aspx" target="_blank"&gt;[WebCast] C# vs Vb.Net&lt;/a&gt;. A cargo de &lt;em&gt;&lt;a title="El Guille" href="http://www.elguille.info/" target="_blank"&gt;El Guille&lt;/a&gt; &lt;/em&gt;y &lt;a title="Marino Posadas" href="http://www.elavefenix.net/Noticias08.aspx" target="_blank"&gt;Marino Posadas&lt;/a&gt;.&lt;/li&gt; &lt;li&gt;&lt;a title="Primer asalto: VB.NET contra C#" href="http://geeks.ms/blogs/rfog/archive/2008/05/05/primer-asalto-vb-net-contra-c.aspx" target="_blank"&gt;Primer asalto: VB.NET contra C#&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a title="La Pregunta del Mill&amp;oacute;n C# &amp;oacute; VB.NET" href="http://geeks.ms/blogs/jlquintero/archive/2007/01/14/la-pregunta-del-mill-n-c-vb-net.aspx" target="_blank"&gt;La Pregunta del Millón C# ó VB.NET&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Saludos,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=108910" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/developer_2B002B00_/default.aspx">developer++</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/.NET/default.aspx">.NET</category><feedburner:origLink>http://geeks.ms/blogs/sergiotarrillo/archive/2008/10/24/108910.aspx</feedburner:origLink></item><item><title>Smart Code Generator…. desde ASP.NET</title><link>http://feedproxy.google.com/~r/sergiotarrillo/~3/2Rg2vaaT1bI/99487.aspx</link><pubDate>Fri, 19 Sep 2008 01:16:10 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:99487</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>4</slash:comments><wfw:commentRss>http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=99487</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2008/09/18/99487.aspx#comments</comments><description>&lt;p&gt;&lt;img alt="http://sergiot2.com/blogimages/2008/09Sep/18-writing-code.jpg" src="http://sergiot2.com/blogimages/2008/09Sep/18-writing-code.jpg" /&gt;  &lt;p&gt;Nuevamente en Lima y con nuevo trabajo laburo, curro, tengo que terminar una aplicación que está al 80%, y da mucha lata pereza hacer código tradicional (creación de entidades, de clases de acceso a datos, etc)  &lt;p&gt;Bajo demanda (ósea cuando los necesite), iré revisando los diversos generadores de código existentes.  &lt;p&gt;&lt;img alt="http://www.smartcodegenerator.com/index_files/image001.gif" src="http://www.smartcodegenerator.com/index_files/image001.gif" /&gt;  &lt;p&gt;&lt;a title="Smart Code Generator - QuickStart" href="http://www.smartcodegenerator.com/" target="_blank"&gt;Smart Code Generator&lt;/a&gt;, es un generador de código a nivel de clases, que tiene como front-end una aplicación Web ASP.NET (VS2005, VS2008). Desde una página Web nosotros podemos generar archivos (Vb, C#), pero en teoría podemos generar cualquier tipo de contenido como Java por ejemplo. Y lo mejor de todo, es que la generación de contenido es a través de plantillas, que son fácilmente personalizables. Como dice su slogan: La generación de código nunca fue tan fácil...  &lt;p&gt;&lt;/p&gt; &lt;p&gt;Después de haberlo &lt;a title="Smart Code Generator" href="http://www.codeplex.com/smartcodegenerator" target="_blank"&gt;descargado desde codeplex&lt;/a&gt;, e instalado, tendremos disponible un nuevo template en Visual Studio. Desde el explorador de soluciones podemos ver el contenido de la Web, pero hay una carpeta que es clave:&lt;/p&gt; &lt;p&gt;&lt;img alt="http://sergiot2.com/blogimages/2008/09Sep/18-VSSolution.jpg" src="http://sergiot2.com/blogimages/2008/09Sep/18-VSSolution.jpg" /&gt;&lt;/p&gt; &lt;p&gt;Cada archivo dentro de la carpeta &lt;strong&gt;Templates&lt;/strong&gt; es para un archivo específico, podemos tener un plantilla para la clase de entidades por ejemplo, una para clase de acceso a datos y así. &lt;/p&gt; &lt;p&gt;Y en cada template nosotros podemos personalizar el contenido:&lt;/p&gt; &lt;p&gt;&lt;img alt="http://sergiot2.com/blogimages/2008/09Sep/18-Template.jpg" src="http://sergiot2.com/blogimages/2008/09Sep/18-Template.jpg" /&gt;&lt;/p&gt; &lt;p&gt;Una de las cosas interesantes, es que podemos hacer uso de las clases de .Net dentro de la generación de código.&lt;/p&gt; &lt;p&gt;Ejecutamos la página Default.aspx:&lt;/p&gt; &lt;p&gt;&lt;img alt="http://sergiot2.com/blogimages/2008/09Sep/18-DBSchema.jpg" src="http://sergiot2.com/blogimages/2008/09Sep/18-DBSchema.jpg" /&gt;&lt;/p&gt; &lt;p&gt;Como ven, ingresamos una conexión, mostramos las tablas disponibles, y seleccionamos aquellas sobre las cuales queremos generar.&lt;/p&gt; &lt;p&gt;Y nada al generar, crea todos los templates que tengamos por cada tabla (NroTemplates*NroTablasSeleccionas):&lt;/p&gt; &lt;p&gt;&lt;img alt="http://sergiot2.com/blogimages/2008/09Sep/18-Files.jpg" src="http://sergiot2.com/blogimages/2008/09Sep/18-Files.jpg" /&gt;&lt;/p&gt; &lt;p&gt;Y si no lo creen, aquí esta un archivo generado:&lt;/p&gt; &lt;p&gt;&lt;img alt="http://sergiot2.com/blogimages/2008/09Sep/18-CodeBody.jpg" src="http://sergiot2.com/blogimages/2008/09Sep/18-CodeBody.jpg" /&gt;&lt;/p&gt; &lt;p&gt;No es tan completo como el paquete de Acceso a Datos del &lt;a title="Web Service Software Factory" href="http://geeks.ms/blogs/sergiotarrillo/archive/2007/12/18/58068.aspx" target="_blank"&gt;Web Service Software Factory&lt;/a&gt;, que genera los proyectos, procedimientos almacenados, uso de buenas prácticas, entre otras. Pero creo que la gran ventaja es la &lt;strong&gt;&lt;u&gt;personalización&lt;/u&gt;&lt;/strong&gt;, es decir si tienes tu propio core o framework de clases, las haces Templates, las copias a este Sitio Web, le dices que tablas vas a usar, y vualá: hecha la magia.&lt;/p&gt; &lt;p&gt;Autor del proyecto: &lt;a title="Shahed Khan (MVP)" href="http://geekswithblogs.net/shahed/Default.aspx" target="_blank"&gt;Shahed Khan (MVP)&lt;/a&gt;, y más features (en inglés) de esta herramienta &lt;a title="Smart Code Generator" href="http://www.codeplex.com/smartcodegenerator" target="_blank"&gt;Smart Code Generator (Asp.Net)&lt;/a&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;All development can be done in VS2005 OR VS2003.  &lt;li&gt;Integration with NAnt and Cassini.  &lt;li&gt;Extensible Template Generation Engine.  &lt;li&gt;Open source Database Schema discovery API for MS SQL, Oracle and MySQL.  &lt;li&gt;Uses existing ASP.NET 2.0 website application OR ASP.NET 1.1 web application concepts  &lt;li&gt;Generates text based output  &lt;li&gt;Fully customisable template-based code generation  &lt;li&gt;Remembers custom property data entries &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;P.D.: La plantilla usada en el ejemplo de arriba no viene por defecto, pero también esta como descarga en &lt;a href="http://www.codeplex.com/smartcodegenerator/Release/ProjectReleases.aspx?ReleaseId=2559" target="_blank"&gt;los releases del proyecto&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Rock tip&lt;/strong&gt;: &lt;a title="Run as in Windows Vista" href="http://technet.microsoft.com/en-us/sysinternals/cc300361.aspx" target="_blank"&gt;Run as in Windows Vista&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Saludos,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=99487" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Rapitools/default.aspx">Rapitools</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Productividad/default.aspx">Productividad</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/Windows+Vista/default.aspx">Windows Vista</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/.NET/default.aspx">.NET</category><feedburner:origLink>http://geeks.ms/blogs/sergiotarrillo/archive/2008/09/18/99487.aspx</feedburner:origLink></item><item><title>MCTS 70-433: SQL Server 2008 - Manejo de tablas y vistas</title><link>http://feedproxy.google.com/~r/sergiotarrillo/~3/1IAGacScwek/97480.aspx</link><pubDate>Fri, 05 Sep 2008 23:12:16 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:97480</guid><dc:creator>Sergio Tarrillo</dc:creator><slash:comments>8</slash:comments><wfw:commentRss>http://geeks.ms/blogs/sergiotarrillo/rsscomments.aspx?PostID=97480</wfw:commentRss><comments>http://geeks.ms/blogs/sergiotarrillo/archive/2008/09/05/97480.aspx#comments</comments><description>&lt;p&gt;&lt;img alt="http://sergiot2.com/blogimages/2008/09Sep/05_Ladrillos.jpg" src="http://sergiot2.com/blogimages/2008/09Sep/05_Ladrillos.jpg" /&gt;&lt;/p&gt; &lt;p&gt;Aunque ahora con las herramientas de consultas, como &lt;a title="SQL Server Management" href="http://geeks.ms/blogs/sergiotarrillo/search.aspx?q=SQL+Server+Management" target="_blank"&gt;SQL Server Management&lt;/a&gt;, se puede hacer cualquier operación con la base de datos, en distintos escenarios vamos a necesitar hacer estas operaciones por queries. Por ejemplo cuando estamos actualizando una versión de base de datos, a de desarrollo a pruebas, o a producción, el modo de hacer un backup y restaurarlo en el otro servidor puede servir al inicio, pero ¿y si la base de datos del otro servidor ya tiene data ingresada? existen varias estrategias para hacer esto, pero la más útil y recomendable por el trabajo que le dado ahora, ha sido generar un archivo actualización con los queries de Update, puede surgir problemas si te olvidas de poner algún query pero ese es otro tema. &lt;/p&gt; &lt;p&gt;Empecemos con el tema...&lt;/p&gt; &lt;p&gt;Tenemos muchas opciones para crear y modificar tablas, usando &lt;a title="SQL Server 2008 - CREATE TABLE (Transact-SQL)" href="http://msdn.microsoft.com/es-es/library/ms174979.aspx" target="_blank"&gt;CREATE TABLE&lt;/a&gt; y &lt;a title="SQL Server 2008 - ALTER TABLE (Transact-SQL)" href="http://msdn.microsoft.com/es-es/library/ms190273.aspx" target="_blank"&gt;ALTER TABLE&lt;/a&gt;. Al crear una tabla nosotros podemos crear columnas calculadas, que son columnas virtuales ya que no son almacenadas físicamente en las tablas, y si queremos almacenarlas físicamente debemos usar el keyword PERSISTED: &lt;a title="SQL Server 2008 - Computed Columns" href="http://msdn.microsoft.com/en-us/library/ms191250.aspx" target="_blank"&gt;Computed Columns&lt;/a&gt;. Con SQL Server 2005 se introdujo el concepto de &lt;a title="Working with schemas in SQL Server 2005" href="http://searchsqlserver.techtarget.com/tip/0,289483,sid87_gci1184503,00.html" target="_blank"&gt;Schemas&lt;/a&gt;, que entre una de las funciones principales permite categorizar y agrupar los permisos dentro de una base de datos, en este artículo se explica la necesidad de la creación de Schema en versiones anteriores: &lt;a title="Understanding the Difference between Owners and Schemas in SQL Server" href="http://www.sqlteam.com/article/understanding-the-difference-between-owners-and-schemas-in-sql-server" target="_blank"&gt;Understanding the Difference between Owners and Schemas in SQL Server&lt;/a&gt;, ver también &lt;a title="SQL Server 2008 - CREATE SCHEMA (Transact-SQL)" href="http://msdn.microsoft.com/en-us/library/ms189462.aspx" target="_blank"&gt;CREATE SCHEMA&lt;/a&gt;. Recordar que &lt;a title="Gracias se&amp;ntilde;ores (*!@#$%!!) por intentar hackear mi sitio... me han ense&amp;ntilde;ado mucho sobre SharePoint" href="http://geeks.ms/blogs/gvelez/archive/2008/07/17/gracias-se-241-ores-por-intentar-hackear-mi-sitio-me-han-ense-241-ado-mucho-sobre-sharepoint.aspx" target="_blank"&gt;la seguridad es importante siempre&lt;/a&gt;, y no después que hemos sido atacados, y siempre tener claro el concepto: &amp;quot;mínimos privilegios&amp;quot;, es decir, si una base de datos tiene distintas aplicaciones que trabajan con ella, y por ejemplo hay una aplicación Web que trabaja con 6 tablas (dentro de un Schema propio), se debería tener un usuario sólo con el permiso a este grupo de tablas, es más si para todas tus modificaciones (CRUD) usas procedimientos almacenados, no deberías permitirle al usuario poder hacer INSERT, UPDATE, o DELETE directamente contra este grupo de tablas, sólo darle permiso de ejecución de los store procedures (CRUD), para modificar los permisos podemos usar &lt;a title="SQL Server 2008 - GRANT (Transact-SQL)" href="http://msdn.microsoft.com/es-es/library/ms187965.aspx" target="_blank"&gt;GRANT&lt;/a&gt;, &lt;a title="SQL Server 2008 - DENY (Transact-SQL)" href="http://msdn.microsoft.com/es-es/library/ms188338.aspx" target="_blank"&gt;DENY&lt;/a&gt;, &lt;a title="REVOKE (Transact-SQL)" href="http://msdn.microsoft.com/es-es/library/ms187728.aspx" target="_blank"&gt;REVOKE&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Sobre las Vistas (&lt;a title="SQL Server 2008 - Views" href="http://msdn.microsoft.com/en-us/library/ms190706.aspx" target="_blank"&gt;Views&lt;/a&gt;) recuerdo que una mini-charla de rendimiento hace años, recomendaron no usarlas, y bueno hasta ahora no he necesitado hacer uso de las mismas. En este artículo podemos &lt;a title="SQL Server 2008 - Understanding Views" href="http://msdn.microsoft.com/en-us/library/ms190174.aspx" target="_blank"&gt;entender las vistas&lt;/a&gt;, y en este otro podemos ver que podemos hacer y que no, con las vistas: &lt;a title="Designing and Implementing Views" href="http://msdn.microsoft.com/en-us/library/ms189918.aspx" target="_blank"&gt;Diseñando e implementando Vistas&lt;/a&gt;. Hay algunas opciones al momento de crear vistas (&lt;a title="CREATE VIEW (Transact-SQL)" href="http://msdn.microsoft.com/es-es/library/ms187956.aspx" target="_blank"&gt;CREATE VIEW&lt;/a&gt;), ENCRYPTION para cifrar el registro en &lt;a href="http://msdn.microsoft.com/es-es/library/ms186293.aspx"&gt;sys.syscomments&lt;/a&gt; que contiene la consulta de la creación de la vista, CHECK OPTION y SCHEMABINDING, para mantener la consistencia cuando se van a &lt;a title="Modificar datos mediante una vista" href="http://msdn.microsoft.com/es-es/library/ms180800.aspx" target="_blank"&gt;modificar los datos en una vista&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;El tema de índices, debería tener una o varias entradas sólo para hablar de ello. Y el tema de índices no muchas veces se entiende en el primer review, charla, u otra fuente de información, sobre todo si no esta bien explicados, pero si debemos saber que el buen uso de &lt;a title="SQL Server 2008 - Indexes" href="http://msdn.microsoft.com/en-us/library/ms189271.aspx" target="_blank"&gt;Indexes&lt;/a&gt; va a mejorar el rendimiento de los queries y aplicaciones que usen nuestra base de datos, debido a que los índices pueden reducir la cantidad de data que se debe leer para devolver un conjunto de registros. Una &lt;a title="SQL Server 2008 - Index Basics" href="http://msdn.microsoft.com/en-us/library/ms190457.aspx" target="_blank"&gt;tabla o vista puede contener&lt;/a&gt; índices &lt;a title="SQL Server 2008 - Clustered Index Structures" href="http://msdn.microsoft.com/en-us/library/ms177443.aspx" target="_blank"&gt;clustered&lt;/a&gt;, y &lt;a title="SQL Server 2008 - Nonclustered Index Structures" href="http://msdn.microsoft.com/en-us/library/ms177484.aspx" target="_blank"&gt;nonclustered&lt;/a&gt;, además existen otras opciones en los &lt;a title="SQL Server 2008 - Types of Indexes" href="http://msdn.microsoft.com/en-us/library/ms175049.aspx" target="_blank"&gt;tipos de índices disponibles en SQL Server&lt;/a&gt;: &lt;a title="SQL Server 2008 - Filtered Index Design Guidelines" href="http://msdn.microsoft.com/en-us/library/cc280372.aspx" target="_blank"&gt;Filtered Index&lt;/a&gt;, &lt;a title="SQL Server 2008 - Index with Included Columns" href="http://msdn.microsoft.com/en-us/library/ms190806.aspx" target="_blank"&gt;Index with Included Columns&lt;/a&gt;, &lt;a title="Unique Index Design Guidelines" href="http://msdn.microsoft.com/en-us/library/ms187019.aspx" target="_blank"&gt;Unique Index&lt;/a&gt;, entre otros. Dentro de las opciones para &lt;a title="SQ Server 2008 - Optimizing Indexes" href="http://msdn.microsoft.com/en-us/library/ms190910.aspx" target="_blank"&gt;optimizar índices&lt;/a&gt;, se encuentra el uso de la opción &lt;a title="SQL Server 2008 - Fill Factor" href="http://msdn.microsoft.com/en-us/library/ms177459.aspx" target="_blank"&gt;Fill Factor&lt;/a&gt;. Cada vez que se ejecuta un query el componente &lt;a title="Query Optimizer" href="http://en.wikipedia.org/wiki/Query_optimizer" target="_blank"&gt;Query Optimizer&lt;/a&gt;, es el encargado de determinar la manera más eficiente de ejecutar un query, basado en los famosos planes de ejecución, es bueno conocer como el Query Optimizer, genera las estadísticas para escoger el plan de ejecución más eficiente, nosotros podemos crear estadísticas (&lt;a title="SQL Server 2008 - CREATE STATISTICS (Transact-SQL)" href="http://msdn.microsoft.com/es-es/library/ms188038.aspx" target="_blank"&gt;CREATE STATISTICS&lt;/a&gt;) de las columnas y su comportamiento con los índices, para más información revisar el siguiente artículo: &lt;a title="Used by the Query Optimizer in Microsoft SQL Server 2005" href="http://www.microsoft.com/technet/prodtechnol/sql/2005/qrystats.mspx" target="_blank"&gt;Statistics Used by the Query Optimizer in Microsoft SQL Server 2005&lt;/a&gt;. Con respecto al tema indexed views, revisar el siguiente artículo: &lt;a title="Improving Performance with SQL Server 2005 Indexed Views" href="http://www.microsoft.com/technet/prodtechnol/sql/2005/qrystats.mspx" target="_blank"&gt;Improving Performance with SQL Server 2005 Indexed Views&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Si ya pasaron el tema de índices, los constraints son más sencillos, son usados para &lt;a title="Enforcing Data Integrity" href="http://msdn.microsoft.com/en-us/library/ms190765.aspx" target="_blank"&gt;forzar la integridad de la data&lt;/a&gt;, y si revisaron el tema de &lt;a title="SQL Server 2008 - CREATE TABLE (Transact-SQL)" href="http://msdn.microsoft.com/es-es/library/ms174979.aspx" target="_blank"&gt;CREATE TABLE&lt;/a&gt; y &lt;a title="SQL Server 2008 - ALTER TABLE (Transact-SQL)" href="http://msdn.microsoft.com/es-es/library/ms190273.aspx" target="_blank"&gt;ALTER TABLE&lt;/a&gt; los deben haber visto: &lt;a title="SQL Server 2008 - PRIMARY KEY Constraints" href="http://msdn.microsoft.com/en-us/library/ms191236.aspx" target="_blank"&gt;PRIMARY KEY&lt;/a&gt; (revisar &lt;a title="SQL Server 2008 - SET IDENTITY_INSERT (Transact-SQL)" href="http://msdn.microsoft.com/es-es/library/ms188059.aspx" target="_blank"&gt;IDENTITY_INSERT&lt;/a&gt; para insertar valores predeterminados a un columna Identity), &lt;a title="SQL Server 2008 - FOREIGN KEY Constraints" href="http://msdn.microsoft.com/en-us/library/ms175464.aspx" target="_blank"&gt;FOREIGN KEY&lt;/a&gt; (revisar &lt;a title="Cascading Referential Integrity Constraints" href="http://msdn.microsoft.com/en-us/library/ms186973.aspx" target="_blank"&gt;las opciones de actualización de información&lt;/a&gt;), &lt;a title="SQL Server 2008 - UNIQUE Constraints" href="http://msdn.microsoft.com/en-us/library/ms191166.aspx" target="_blank"&gt;UNIQUE&lt;/a&gt;, &lt;a title="CHECK Constraints" href="http://msdn.microsoft.com/en-us/library/ms188258.aspx" target="_blank"&gt;CHECK&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Los tipos de &lt;a title="Designing and Implementing Structured Storage (Database Engine)" href="http://msdn.microsoft.com/en-us/library/bb510424.aspx" target="_blank"&gt;datos estructurados&lt;/a&gt;, son los que veníamos usando desde las primeras versiones de SQL, con SQL Server 2005 se contaba con &lt;a title="Designing and Implementing Semistructured Storage (Database Engine)" href="http://msdn.microsoft.com/en-us/library/bb522446.aspx" target="_blank"&gt;datos semi-estructurados (Xml)&lt;/a&gt;. Ahora con SQL Server 2008 tenemos el tipo de &lt;a title="Designing and Implementing Spatial Storage (Database Engine)" href="http://msdn.microsoft.com/en-us/library/bb933790.aspx" target="_blank"&gt;datos espacial&lt;/a&gt;, y el tipo &lt;a title="Designing and Implementing FILESTREAM Storage" href="http://msdn.microsoft.com/en-us/library/bb895234.aspx" target="_blank"&gt;FileStream&lt;/a&gt;, y respecto a estos últimos hay mucha información en los blogs, e internet en general.&lt;/p&gt; &lt;p&gt;Partición de tablas e índices, siempre lo distribuido (cuando se hace bien) tiende a llevar a una alta disponibilidad y escalabilidad. La &lt;a title="SQL Server 2008 - Partitioned Tables and Indexes" href="http://msdn.microsoft.com/en-us/library/ms188706.aspx" target="_blank"&gt;partición de tablas e índices&lt;/a&gt;, permite que la data sea dividida horizontalmente y puede ser colocada en más de un filegroup. Recordar que la &lt;a title="SQL Server 2008 - Partitioned Table and Index Concepts" href="http://msdn.microsoft.com/en-us/library/ms190787.aspx" target="_blank"&gt;partición de tablas e índices&lt;/a&gt; sólo esta disponible en las versiones SQL Server Enterprise y SQL Server Developer Edition. &lt;a title="Planning Guidelines for Partitioned Tables and Indexes" href="http://msdn.microsoft.com/en-us/library/ms180767.aspx" target="_blank"&gt;Antes de particionar las tablas o índices&lt;/a&gt;, debemos crear los siguientes objetos: &lt;a title="SQL Server 2008 - CREATE PARTITION FUNCTION (Transact-SQL)" href="http://msdn.microsoft.com/en-us/library/ms187802.aspx" target="_blank"&gt;Partition Function&lt;/a&gt;, para especificar como la tabla o los índices serán particionados y &lt;a title="SQL Server 2008 - CREATE PARTITION SCHEME (Transact-SQL)" href="http://msdn.microsoft.com/en-us/library/ms179854.aspx" target="_blank"&gt;Partition Scheme&lt;/a&gt; mapea las particiones producidas por una Partition Function para asignarlas a los filefroups definidos. Existen &lt;a title="Table Partitioning in SQL Server 2005 -- Part III" href="http://www.dotnetspider.com/resources/2331-Table-Partitioning-SQL-Server---Part-III.aspx" target="_blank"&gt;tres diferentes tipos de operaciones con particiones&lt;/a&gt;: MERGE, SPLIT, y SWITCH. Por cierto también podemos hacer &lt;a href="http://msdn.microsoft.com/en-us/library/ms181036.aspx" target="_blank"&gt;partición de las vistas&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;P.D.: Algunas de las mejoras del SQL Server Management Studio (2008), es el IntellSense para algunos keywords y algunos objetos (todavía no tengo claro el patrón), y algo que se pedía a gritos el agrupamiento de un bloque de código en los queries, ósea como si usaras las llaves de C# y puedes comprimir las líneas visibles de código, para la otra versión espero el #region...#endregion :D.&lt;/p&gt; &lt;p&gt;Saludos,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=97480" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://geeks.ms/blogs/sergiotarrillo/archive/tags/MCTS/default.aspx">MCTS</category><feedburner:origLink>http://geeks.ms/blogs/sergiotarrillo/archive/2008/09/05/97480.aspx</feedburner:origLink></item></channel></rss>
