<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3629805769059546150</id><updated>2011-09-27T21:56:55.533-03:00</updated><category term='C#'/><category term='SQL Scripts'/><category term='Open Source Utilities'/><category term='Blog'/><category term='ASP.NET'/><category term='.NET'/><title type='text'>{by kerzek}</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://kerzek.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3629805769059546150/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://kerzek.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>[?]</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3629805769059546150.post-7928561854663486634</id><published>2008-05-05T00:20:00.006-03:00</published><updated>2008-05-05T00:59:00.215-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Implementando roles y permisos en ASP.Net con una clase base</title><content type='html'>En aplicaciones web por más básicas que sean, seguramente se debe implementar un mecanismo de seguridad que permita o restrinja el acceso de ciertos usuarios a determinadas páginas. De esta manera, podemos tener un rol Administrador y otro rol por default Usuario, en el que el primero podrá ingresar a páginas que un usuario común no debería. &lt;br /&gt;&lt;br /&gt;Implementar esto en ASP.Net sin usar Personalization, es relativamente fácil. Se debe verificar en el momento en el que se carga la página si el usuario actual está autenticado o autorizado para acceder a ella. Fácil, pero engorroso. Hacer lo mismo para CADA página no es muy divertido que digamos. Sí, se puede usar una clase que use un método estático al que se le pase el nombre de la página actual y devuelva un valor booleano que me indique si tengo acceso o no. Pero igualmente deberíamos llamarlo en cada página. &lt;br /&gt;&lt;br /&gt;Existe otro forma, a mi parecer mil veces más convienente. Hacer una clase base que herede de System.Web.Page, de la cual van a heredar en el codebehind las páginas de la aplicación.&lt;br /&gt;&lt;br /&gt;Básicamente, lo que hace esta clase es preguntar “este que quiere acceder, tiene los permisos?”. Si es cierto, accede por supuesto, si no ejecuta una acción predeterminada en la misma clase base, que será seteable con una enumeración. Vamos por partes: &lt;br /&gt;&lt;br /&gt;Definmos la enumeración de la acción a ejecutar en caso de acceso denegado:&lt;br /&gt;&lt;br /&gt;&lt;div class="csharpcode" style="overflow:auto;"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;enum&lt;/span&gt; AccessDeniedEnum&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;    NoDefined,&lt;/pre&gt;&lt;pre&gt;    RedirectToLoginPage,&lt;/pre&gt;&lt;pre class="alt"&gt;    ThrowHttpAccessDeniedException&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Tendremos un método se llamará en el caso de acceso denegado y que preguntará por el valor de la enumeración y realizará una acción distinta en cada caso. El primer valor es el que tomará por defecto:&lt;br /&gt;&lt;br /&gt;&lt;div class="csharpcode" style="overflow:auto;"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; AccessDeniedAction()&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;this&lt;/span&gt;._accessDeniedActionEnm == AccessDeniedEnum.NoDefined)&lt;/pre&gt;&lt;pre&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="rem"&gt;// acción por defecto&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;this&lt;/span&gt;._accessDeniedActionEnm = AccessDeniedEnum.ThrowHttpAccessDeniedException;&lt;/pre&gt;&lt;pre class="alt"&gt;    }&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;switch&lt;/span&gt; (_accessDeniedActionEnm)&lt;/pre&gt;&lt;pre&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;case&lt;/span&gt; WebGenesis.Utils.AppEnums.AccessDeniedEnum.RedirectToLoginPage:&lt;/pre&gt;&lt;pre&gt;            Response.Redirect(&lt;span class="str"&gt;"~/loginPage.aspx"&lt;/span&gt;, &lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;case&lt;/span&gt; WebGenesis.Utils.AppEnums.AccessDeniedEnum.ThrowHttpAccessDeniedException:&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; HttpException(403, &lt;span class="str"&gt;"No tiene los permisos necesarios para acceder a esta página"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;break&lt;/span&gt;;                &lt;/pre&gt;&lt;pre class="alt"&gt;    }&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;También un método virtual (sobreescribible :D) que permite devolver directamente un true en caso de que existan páginas que necesitemos que sean de acceso general y no queremos tener que definir los permisos necesarios para todos, ni tampoco queremos perder el tiempo verficándolo. Entonces nuestra página sobreescribirá este método, y solamente retornará true. Los valores de la colección pageForRole son los nombres de las páginas, del tipo “pagina.aspx”, que el usuario actual puede ver. &lt;br /&gt;&lt;br /&gt;&lt;div class="csharpcode" style="overflow:auto;"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsAutorizedAccess()&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (Session[&lt;span class="str"&gt;"PagesForRole"&lt;/span&gt;] == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;        LoadRolePermissions();&lt;/pre&gt;&lt;pre&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="rem"&gt;//Obtengo las páginas autorizadas para el rol            &lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; pagesForRole = (List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;)Session[&lt;span class="str"&gt;"PagesForRole"&lt;/span&gt;];&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;string&lt;/span&gt; currentPageName = GetPageName();&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;// Si la página está en la lista, el usuario está autorizado&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (pagesForRole.Contains(currentPageName))&lt;/pre&gt;&lt;pre class="alt"&gt;    {&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;    }&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Entonces tendremos un método LoadRolePermissions que cargará las páginas para cada rol. El método está completo en el código final, es lo que habría que modificar para cargar las páginas por rol. Tomando los datos de una base de datos, XML, o de lo que sea. Y toma el usuario suponiendo que está cargado en sesión.&lt;br /&gt;&lt;br /&gt;Ahora como se implementa esta clase base en las páginas? Simplemente heredándola en vez de la clase System.Web.Page&lt;br /&gt;&lt;br /&gt;public partial class ejemplo1Framework : BaseClasses.BasePage&lt;br /&gt;&lt;br /&gt;Si quiero hacer que sea se de público acceso: sobreescribo el método IsAutorizedAccess y retorno true.&lt;br /&gt;&lt;br /&gt;protected override bool IsAutorizedAccess()&lt;br /&gt;{&lt;br /&gt;      return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Si quiero cambiar lo “que va a hacer” en caso de que tener permiso denegado, como loquearse nuevamente, o mostrar un mensaje de error, etc, seteo la propiedad AccessDeniedActionEnm en el constructor de la página:&lt;br /&gt;&lt;br /&gt;public partial class ejemplo2Framework : WebGenesis.BaseClasses.AbstractGeneralPage&lt;br /&gt;{&lt;br /&gt;    public ejemplo2Framework()&lt;br /&gt;    {&lt;br /&gt;     // si necesito cambiar la acción por default de página denegada, lo hago aquí.&lt;br /&gt;            this.AccessDeniedActionEnm = AccessDeniedEnum.RedirectToLoginPage;&lt;br /&gt;&lt;br /&gt;            Page.Init += new EventHandler(Page_Init);            &lt;br /&gt;        }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Este método que implemento es muy fácil de utilizar, y lo quería compartir. Aquí solo se hizo uso de la autorización de usuarios en esta clase base, pero se puede extender a todas las funcionalidades comunes que tendrán las páginas de nuestra aplicación. Espero que me haya explicado bien, como este es un blog, cualquier duda, crítica o amenaza me comentan. Les dejo el código completo de la clase base abajo. Saludos!&lt;br /&gt;&lt;br /&gt;&lt;div class="csharpcode" style="overflow:auto;"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.IO;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Data;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Configuration;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.Security;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.UI;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.UI.WebControls;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.UI.HtmlControls;&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; BaseClasses&lt;/pre&gt;&lt;pre class="alt"&gt;{&lt;/pre&gt;&lt;pre&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;/// Clase base de la cual heredarán todas las &lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="rem"&gt;/// páginas de la aplicación.&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;/// Gestiona la autorización de usuarios.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; BasePage : System.Web.UI.Page&lt;/pre&gt;&lt;pre&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="rem"&gt;// _enmAccessDenied se va a utilizar para realizar determinada &lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="rem"&gt;// una acción al intentar acceder a una página a la cual no se tiene acceso.         &lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; AccessDeniedEnum _accessDeniedActionEnm;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; _pageName;&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;enum&lt;/span&gt; AccessDeniedEnum&lt;/pre&gt;&lt;pre class="alt"&gt;        {&lt;/pre&gt;&lt;pre&gt;            NoDefined,&lt;/pre&gt;&lt;pre class="alt"&gt;            RedirectToLoginPage,&lt;/pre&gt;&lt;pre&gt;            ThrowHttpAccessDeniedException&lt;/pre&gt;&lt;pre class="alt"&gt;        }&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="preproc"&gt;#region&lt;/span&gt; Properties&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; PageName&lt;/pre&gt;&lt;pre&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;            get { &lt;span class="kwrd"&gt;return&lt;/span&gt; _pageName; }&lt;/pre&gt;&lt;pre&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Utils.AppEnums.AccessDeniedEnum AccessDeniedActionEnm&lt;/pre&gt;&lt;pre class="alt"&gt;        {&lt;/pre&gt;&lt;pre&gt;            get { &lt;span class="kwrd"&gt;return&lt;/span&gt; _accessDeniedActionEnm; }&lt;/pre&gt;&lt;pre class="alt"&gt;            set { _accessDeniedActionEnm = &lt;span class="kwrd"&gt;value&lt;/span&gt;; }&lt;/pre&gt;&lt;pre&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="preproc"&gt;#region&lt;/span&gt; Constructors&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; BasePage()&lt;/pre&gt;&lt;pre class="alt"&gt;        {&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.Init += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler(BasePage_Init);&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;this&lt;/span&gt;.Load += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler(BasePage_Load);&lt;/pre&gt;&lt;pre&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="preproc"&gt;#region&lt;/span&gt; PageEvents&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; BasePage_Load(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;&lt;pre&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;        }&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; BasePage_Init(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;&lt;pre&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (!IsAutorizedAccess())&lt;/pre&gt;&lt;pre&gt;            {&lt;/pre&gt;&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;this&lt;/span&gt;.AccessDeniedAction();&lt;/pre&gt;&lt;pre&gt;            }&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;            _pageName = GetPageName();&lt;/pre&gt;&lt;pre class="alt"&gt;        }&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="preproc"&gt;#region&lt;/span&gt; Virtual Methods&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsAutorizedAccess()&lt;/pre&gt;&lt;pre&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (Session[&lt;span class="str"&gt;"PagesForRole"&lt;/span&gt;] == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;            {&lt;/pre&gt;&lt;pre class="alt"&gt;                LoadRolePermissions();&lt;/pre&gt;&lt;pre&gt;            }&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="rem"&gt;//Obtengo las páginas autorizadas para el rol            &lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; pagesForRole = (List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;)Session[&lt;span class="str"&gt;"PagesForRole"&lt;/span&gt;];&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; currentPageName = GetPageName();&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="rem"&gt;// Si la página está en la lista, el usuario está autorizado&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (pagesForRole.Contains(currentPageName))&lt;/pre&gt;&lt;pre class="alt"&gt;            {&lt;/pre&gt;&lt;pre&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;            }&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="preproc"&gt;#region&lt;/span&gt; Private Methods&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="rem"&gt;/// Acción que se ejecuta al intentar ingresar a una página&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="rem"&gt;/// a la que no se tiene acceso.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="rem"&gt;/// La acción se puede modificar en el constructor&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="rem"&gt;/// de cada página.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; AccessDeniedAction()&lt;/pre&gt;&lt;pre&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;this&lt;/span&gt;._accessDeniedActionEnm == AccessDeniedEnum.NoDefined)&lt;/pre&gt;&lt;pre&gt;            {&lt;/pre&gt;&lt;pre class="alt"&gt;                &lt;span class="rem"&gt;// acción por defecto&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;                &lt;span class="kwrd"&gt;this&lt;/span&gt;._accessDeniedActionEnm = AccessDeniedEnum.ThrowHttpAccessDeniedException;&lt;/pre&gt;&lt;pre class="alt"&gt;            }&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;switch&lt;/span&gt; (_accessDeniedActionEnm)&lt;/pre&gt;&lt;pre&gt;            {&lt;/pre&gt;&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; WebGenesis.Utils.AppEnums.AccessDeniedEnum.RedirectToLoginPage:&lt;/pre&gt;&lt;pre&gt;                    Response.Redirect(&lt;span class="str"&gt;"~/loginPage.aspx"&lt;/span&gt;, &lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;                &lt;span class="kwrd"&gt;case&lt;/span&gt; WebGenesis.Utils.AppEnums.AccessDeniedEnum.ThrowHttpAccessDeniedException:&lt;/pre&gt;&lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; HttpException(403, &lt;span class="str"&gt;"No tiene los permisos necesarios para acceder a esta página"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;                    &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;            }&lt;/pre&gt;&lt;pre&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; LoadRolePermissions()&lt;/pre&gt;&lt;pre class="alt"&gt;        {&lt;/pre&gt;&lt;pre&gt;            &lt;span class="rem"&gt;//cargo en una lista las páginas autorizadas&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="rem"&gt;//para el rol&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; pagesForRole = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;();&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;            pagesForRole.Add(&lt;span class="str"&gt;"default.aspx"&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;            Session.Add(&lt;span class="str"&gt;"PagesForRole"&lt;/span&gt;, pagesForRole);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="rem"&gt;// implemento tomando los permisos desde la BD&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            DataSet ds = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataSet();&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="rem"&gt;//TODO hago algo inteligente aquí...&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (ds.Tables.Count &amp;lt; 1)&lt;/pre&gt;&lt;pre&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (DataRow dr &lt;span class="kwrd"&gt;in&lt;/span&gt; ds.Tables[0].Rows)&lt;/pre&gt;&lt;pre&gt;            {&lt;/pre&gt;&lt;pre class="alt"&gt;                pagesForRole.Add(dr[&lt;span class="str"&gt;"pageName"&lt;/span&gt;].ToString());&lt;/pre&gt;&lt;pre&gt;            }&lt;/pre&gt;&lt;pre class="alt"&gt;            Session.Add(&lt;span class="str"&gt;"PagesForRole"&lt;/span&gt;, pagesForRole);&lt;/pre&gt;&lt;pre&gt;            &lt;span class="rem"&gt;//&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;        }&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetPageName()&lt;/pre&gt;&lt;pre&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="rem"&gt;//Obtengo el nombre de la página actual            &lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            FileInfo fi = &lt;span class="kwrd"&gt;new&lt;/span&gt; FileInfo(&lt;span class="kwrd"&gt;this&lt;/span&gt;.Page.Request.FilePath);&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; fi.Name.ToLower();&lt;/pre&gt;&lt;pre&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    }&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3629805769059546150-7928561854663486634?l=kerzek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kerzek.blogspot.com/feeds/7928561854663486634/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3629805769059546150&amp;postID=7928561854663486634' title='7 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3629805769059546150/posts/default/7928561854663486634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3629805769059546150/posts/default/7928561854663486634'/><link rel='alternate' type='text/html' href='http://kerzek.blogspot.com/2008/05/implementando-roles-y-permisos-en.html' title='Implementando roles y permisos en ASP.Net con una clase base'/><author><name>[?]</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3629805769059546150.post-5551757248926604638</id><published>2008-04-17T01:59:00.007-03:00</published><updated>2008-04-17T02:09:48.851-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Scripts'/><title type='text'>Buscar un texto en todas las bases de datos</title><content type='html'>En &lt;a href="http://www.sqlservercentral.com/scripts/Miscellaneous/62066/"&gt;este artículo&lt;/a&gt; publican un stored procedure para SQL Server 2005 que permite buscar texto en todas las bases de datos del servidor.&lt;br /&gt;Simplemente se le pasa el texto a buscar, y opcionalmente el nombre de la base de datos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Ejemplo de uso&lt;/span&gt;:&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;exec&lt;/span&gt; dbo.proc_search_for_text &lt;span class="str"&gt;'Nathan'&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;exec&lt;/span&gt; dbo.proc_search_for_text &lt;span class="str"&gt;'Everett'&lt;/span&gt;, &lt;span class="str"&gt;'AdventureWorks'&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Links&lt;/span&gt;:  &lt;br /&gt;&lt;a href="http://www.sqlservercentral.com/scripts/Miscellaneous/62066/"&gt;Search for a text in all databases&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3629805769059546150-5551757248926604638?l=kerzek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kerzek.blogspot.com/feeds/5551757248926604638/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3629805769059546150&amp;postID=5551757248926604638' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3629805769059546150/posts/default/5551757248926604638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3629805769059546150/posts/default/5551757248926604638'/><link rel='alternate' type='text/html' href='http://kerzek.blogspot.com/2008/04/buscar-un-texto-en-todas-las-bases-de.html' title='Buscar un texto en todas las bases de datos'/><author><name>[?]</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3629805769059546150.post-228860333174183694</id><published>2008-04-16T22:33:00.016-03:00</published><updated>2008-04-17T01:39:11.453-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>C# - Convertir números a letras</title><content type='html'>Esta debe ser una de las funciones más solicitadas por los desarrolladores, consiste en convertir un número dado a letras. Esta función recibe el número como parámetro, hagan un ToString() antes, porque lo recibe como string, y devuelve el resultado en letras.&lt;br /&gt;&lt;br /&gt;Modifiqué el método y lo hice estático para no tener que instanciar un objeto para su uso.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ejemplos de retornos:&lt;/span&gt;&lt;br /&gt;8794     --&gt; "OCHO MIL SETECIENTOS NOVENTA Y CUATRO"&lt;br /&gt;97494131 --&gt; "NOVENTA Y SIETE MILLONES CUATROCIENTOS NOVENTA Y CUATRO MIL CIENTO TREINTA Y UNO"&lt;br /&gt;59843.4  --&gt; "CINCUENTA Y NUEVE MIL OCHOCIENTOS CUARENTA Y TRES CON 40/100"&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;La clase:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="csharpcode" style="overflow: auto;"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; Utilidades &lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;   public &lt;span class="kwrd"&gt;class&lt;/span&gt; Conversiones&lt;/pre&gt;&lt;pre&gt;   {&lt;/pre&gt;&lt;pre class="alt"&gt;       &lt;span class="kwrd"&gt;public static string&lt;/span&gt; NumeroALetras(&lt;span class="kwrd"&gt;string&lt;/span&gt; num)&lt;/pre&gt;&lt;pre&gt;       {&lt;/pre&gt;&lt;pre class="alt"&gt;           &lt;span class="kwrd"&gt;string&lt;/span&gt; res, dec = &lt;span class="str"&gt;""&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;           Int64 entero;&lt;/pre&gt;&lt;pre class="alt"&gt;           &lt;span class="kwrd"&gt;int&lt;/span&gt; decimales;&lt;/pre&gt;&lt;pre&gt;           &lt;span class="kwrd"&gt;double&lt;/span&gt; nro;&lt;/pre&gt;&lt;pre class="alt"&gt; &lt;/pre&gt;&lt;pre&gt;           &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;           {&lt;/pre&gt;&lt;pre&gt;               nro = Convert.ToDouble(num);&lt;/pre&gt;&lt;pre class="alt"&gt;           }&lt;/pre&gt;&lt;pre&gt;           &lt;span class="kwrd"&gt;catch&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;           {&lt;/pre&gt;&lt;pre&gt;               &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;""&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;           }&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;           entero = Convert.ToInt64(Math.Truncate(nro));&lt;/pre&gt;&lt;pre&gt;           decimales = Convert.ToInt32(Math.Round((nro - entero) * 100, 2));&lt;/pre&gt;&lt;pre class="alt"&gt; &lt;/pre&gt;&lt;pre&gt;           &lt;span class="kwrd"&gt;if&lt;/span&gt; (decimales &amp;gt; 0)&lt;/pre&gt;&lt;pre class="alt"&gt;           {&lt;/pre&gt;&lt;pre&gt;               dec = &lt;span class="str"&gt;" CON "&lt;/span&gt; + decimales.ToString() + &lt;span class="str"&gt;"/100"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;           }&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;           res = Utilidades.Conversiones.NumeroALetras(Convert.ToDouble(entero)) + dec;&lt;/pre&gt;&lt;pre&gt;           &lt;span class="kwrd"&gt;return&lt;/span&gt; res;&lt;/pre&gt;&lt;pre class="alt"&gt;       }&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;       &lt;span class="kwrd"&gt;private static string&lt;/span&gt; NumeroALetras(&lt;span class="kwrd"&gt;double&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;       {&lt;/pre&gt;&lt;pre class="alt"&gt;           &lt;span class="kwrd"&gt;string&lt;/span&gt; Num2Text = &lt;span class="str"&gt;""&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;           &lt;span class="kwrd"&gt;value&lt;/span&gt; = Math.Truncate(&lt;span class="kwrd"&gt;value&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt; &lt;/pre&gt;&lt;pre&gt;           &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 0) Num2Text = &lt;span class="str"&gt;"CERO"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 1) Num2Text = &lt;span class="str"&gt;"UNO"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 2) Num2Text = &lt;span class="str"&gt;"DOS"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 3) Num2Text = &lt;span class="str"&gt;"TRES"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 4) Num2Text = &lt;span class="str"&gt;"CUATRO"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 5) Num2Text = &lt;span class="str"&gt;"CINCO"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 6) Num2Text = &lt;span class="str"&gt;"SEIS"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 7) Num2Text = &lt;span class="str"&gt;"SIETE"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 8) Num2Text = &lt;span class="str"&gt;"OCHO"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 9) Num2Text = &lt;span class="str"&gt;"NUEVE"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 10) Num2Text = &lt;span class="str"&gt;"DIEZ"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 11) Num2Text = &lt;span class="str"&gt;"ONCE"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 12) Num2Text = &lt;span class="str"&gt;"DOCE"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 13) Num2Text = &lt;span class="str"&gt;"TRECE"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 14) Num2Text = &lt;span class="str"&gt;"CATORCE"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 15) Num2Text = &lt;span class="str"&gt;"QUINCE"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; &amp;lt; 20) Num2Text = &lt;span class="str"&gt;"DIECI"&lt;/span&gt; + toText(&lt;span class="kwrd"&gt;value&lt;/span&gt; - 10);&lt;/pre&gt;&lt;pre class="alt"&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 20) Num2Text = &lt;span class="str"&gt;"VEINTE"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; &amp;lt; 30) Num2Text = &lt;span class="str"&gt;"VEINTI"&lt;/span&gt; + toText(&lt;span class="kwrd"&gt;value&lt;/span&gt; - 20);&lt;/pre&gt;&lt;pre class="alt"&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 30) Num2Text = &lt;span class="str"&gt;"TREINTA"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 40) Num2Text = &lt;span class="str"&gt;"CUARENTA"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 50) Num2Text = &lt;span class="str"&gt;"CINCUENTA"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 60) Num2Text = &lt;span class="str"&gt;"SESENTA"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 70) Num2Text = &lt;span class="str"&gt;"SETENTA"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 80) Num2Text = &lt;span class="str"&gt;"OCHENTA"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 90) Num2Text = &lt;span class="str"&gt;"NOVENTA"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; &amp;lt; 100) Num2Text = toText(Math.Truncate(&lt;span class="kwrd"&gt;value&lt;/span&gt; / 10) * 10) + &lt;span class="str"&gt;" Y "&lt;/span&gt; + toText(&lt;span class="kwrd"&gt;value&lt;/span&gt; % 10);&lt;/pre&gt;&lt;pre&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 100) Num2Text = &lt;span class="str"&gt;"CIEN"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; &amp;lt; 200) Num2Text = &lt;span class="str"&gt;"CIENTO "&lt;/span&gt; + toText(&lt;span class="kwrd"&gt;value&lt;/span&gt; - 100);&lt;/pre&gt;&lt;pre&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; ((&lt;span class="kwrd"&gt;value&lt;/span&gt; == 200) || (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 300) || (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 400) || (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 600) || (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 800)) Num2Text = toText(Math.Truncate(&lt;span class="kwrd"&gt;value&lt;/span&gt; / 100)) + &lt;span class="str"&gt;"CIENTOS"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt; &lt;/pre&gt;&lt;pre&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 500) Num2Text = &lt;span class="str"&gt;"QUINIENTOS"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 700) Num2Text = &lt;span class="str"&gt;"SETECIENTOS"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 900) Num2Text = &lt;span class="str"&gt;"NOVECIENTOS"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; &amp;lt; 1000) Num2Text = toText(Math.Truncate(&lt;span class="kwrd"&gt;value&lt;/span&gt; / 100) * 100) + &lt;span class="str"&gt;" "&lt;/span&gt; + toText(&lt;span class="kwrd"&gt;value&lt;/span&gt; % 100);&lt;/pre&gt;&lt;pre&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 1000) Num2Text = &lt;span class="str"&gt;"MIL"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; &amp;lt; 2000) Num2Text = &lt;span class="str"&gt;"MIL "&lt;/span&gt; + toText(&lt;span class="kwrd"&gt;value&lt;/span&gt; % 1000);&lt;/pre&gt;&lt;pre&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; &amp;lt; 1000000)&lt;/pre&gt;&lt;pre class="alt"&gt;           {&lt;/pre&gt;&lt;pre&gt;               Num2Text = toText(Math.Truncate(&lt;span class="kwrd"&gt;value&lt;/span&gt; / 1000)) + &lt;span class="str"&gt;" MIL"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;               &lt;span class="kwrd"&gt;if&lt;/span&gt; ((&lt;span class="kwrd"&gt;value&lt;/span&gt; % 1000) &amp;gt; 0) Num2Text = Num2Text + &lt;span class="str"&gt;" "&lt;/span&gt; + toText(&lt;span class="kwrd"&gt;value&lt;/span&gt; % 1000);&lt;/pre&gt;&lt;pre&gt;           }&lt;/pre&gt;&lt;pre class="alt"&gt; &lt;/pre&gt;&lt;pre&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 1000000) Num2Text = &lt;span class="str"&gt;"UN MILLON"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; &amp;lt; 2000000) Num2Text = &lt;span class="str"&gt;"UN MILLON "&lt;/span&gt; + toText(&lt;span class="kwrd"&gt;value&lt;/span&gt; % 1000000);&lt;/pre&gt;&lt;pre&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; &amp;lt; 1000000000000)&lt;/pre&gt;&lt;pre class="alt"&gt;           {&lt;/pre&gt;&lt;pre&gt;               Num2Text = toText(Math.Truncate(&lt;span class="kwrd"&gt;value&lt;/span&gt; / 1000000)) + &lt;span class="str"&gt;" MILLONES "&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;               &lt;span class="kwrd"&gt;if&lt;/span&gt; ((&lt;span class="kwrd"&gt;value&lt;/span&gt; - Math.Truncate(&lt;span class="kwrd"&gt;value&lt;/span&gt; / 1000000) * 1000000) &amp;gt; 0) Num2Text = Num2Text + &lt;span class="str"&gt;" "&lt;/span&gt; + toText(&lt;span class="kwrd"&gt;value&lt;/span&gt; - Math.Truncate(&lt;span class="kwrd"&gt;value&lt;/span&gt; / 1000000) * 1000000);&lt;/pre&gt;&lt;pre&gt;           }&lt;/pre&gt;&lt;pre class="alt"&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; == 1000000000000) Num2Text = &lt;span class="str"&gt;"UN BILLON"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;value&lt;/span&gt; &amp;lt; 2000000000000) Num2Text = &lt;span class="str"&gt;"UN BILLON "&lt;/span&gt; + toText(&lt;span class="kwrd"&gt;value&lt;/span&gt; - Math.Truncate(&lt;span class="kwrd"&gt;value&lt;/span&gt; / 1000000000000) * 1000000000000);&lt;/pre&gt;&lt;pre class="alt"&gt;           &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;           {&lt;/pre&gt;&lt;pre class="alt"&gt;               Num2Text = toText(Math.Truncate(&lt;span class="kwrd"&gt;value&lt;/span&gt; / 1000000000000)) + &lt;span class="str"&gt;" BILLONES"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;               &lt;span class="kwrd"&gt;if&lt;/span&gt; ((&lt;span class="kwrd"&gt;value&lt;/span&gt; - Math.Truncate(&lt;span class="kwrd"&gt;value&lt;/span&gt; / 1000000000000) * 1000000000000) &amp;gt; 0) Num2Text = Num2Text + &lt;span class="str"&gt;" "&lt;/span&gt; + toText(&lt;span class="kwrd"&gt;value&lt;/span&gt; - Math.Truncate(&lt;span class="kwrd"&gt;value&lt;/span&gt; / 1000000000000) * 1000000000000);&lt;/pre&gt;&lt;pre class="alt"&gt;           }&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;           &lt;span class="kwrd"&gt;return&lt;/span&gt; Num2Text;&lt;/pre&gt;&lt;pre&gt;       }&lt;/pre&gt;&lt;pre class="alt"&gt;   }&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Fuente: &lt;a href="http://msmvps.com/"&gt;msmvps.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3629805769059546150-228860333174183694?l=kerzek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kerzek.blogspot.com/feeds/228860333174183694/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3629805769059546150&amp;postID=228860333174183694' title='17 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3629805769059546150/posts/default/228860333174183694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3629805769059546150/posts/default/228860333174183694'/><link rel='alternate' type='text/html' href='http://kerzek.blogspot.com/2008/04/c-convertir-nmeros-letras.html' title='C# - Convertir números a letras'/><author><name>[?]</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3629805769059546150.post-7883976980682531142</id><published>2008-04-16T00:39:00.015-03:00</published><updated>2008-04-16T01:13:04.664-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>C# - Cargar un comboBox desde una enumeración</title><content type='html'>Como cargar un comboBox (DropDownList Control) desde una enumeración. Hay varias formas de hacerlo, pero esta es la que uso por su simplicidad.&lt;br /&gt;&lt;br /&gt;En el ejemplo cargo los colores definidos en la librería System.Drawing.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Para el ejemplo importar&lt;/span&gt;:&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Drawing;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cargo el Combobox&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;this&lt;/span&gt;.comboBox1.DisplayMember = &lt;span class="str"&gt;"key"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;this&lt;/span&gt;.comboBox1.ValueMember = &lt;span class="str"&gt;"value"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;this&lt;/span&gt;.comboBox1.DataSource = Enum.GetValues(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(KnownColor));&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Obtengo el ítem seleccionado&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; comboBox1_SelectedIndexChanged(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;    KnownColor colorSelected;&lt;/pre&gt;&lt;pre&gt;    colorSelected = (KnownColor)&lt;span class="kwrd"&gt;this&lt;/span&gt;.comboBox1.SelectedValue;&lt;/pre&gt;&lt;pre class="alt"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Como verán, primero lo casteo a la enumeración con lo cual lo cargo, para manipular luego el ítem como tal. Por supuesto que el método también aplica para VB.NET. Simple y eficaz.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3629805769059546150-7883976980682531142?l=kerzek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kerzek.blogspot.com/feeds/7883976980682531142/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3629805769059546150&amp;postID=7883976980682531142' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3629805769059546150/posts/default/7883976980682531142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3629805769059546150/posts/default/7883976980682531142'/><link rel='alternate' type='text/html' href='http://kerzek.blogspot.com/2008/04/c-cargar-un-combobox-con-una-enumeracin.html' title='C# - Cargar un comboBox desde una enumeración'/><author><name>[?]</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3629805769059546150.post-162411020689346440</id><published>2008-04-14T03:12:00.012-03:00</published><updated>2008-04-14T03:49:44.208-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Open Source Utilities'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Crear y leer archivos ZIP en aplicaciones .Net</title><content type='html'>&lt;a href="http://www.codeplex.com/DotNetZip/"&gt;DotNetZip&lt;/a&gt; es un biblioteca open source que permite comprimir y extraer archivos zip. A diferencia de la librería System.IO.Compression, es más versátil y muy fácil de usar. Lo único que se necesita es &lt;a href="http://www.codeplex.com/DotNetZip/Release/ProjectReleases.aspx?ReleaseId=8220"&gt;bajar&lt;/a&gt; el archivo binario (DLL, menos de 20k) o el código fuente y agregarlo a nuestra solución.&lt;br /&gt;Soporta el framework 2.0, 3.0 y 3.5.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Ejemplos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;Comprimir un directorio (recursivo, incluye subdirectorios):&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; (ZipFile zip = &lt;span class="kwrd"&gt;new&lt;/span&gt; ZipFile(args[0]))&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre&gt;  zip.AddDirectory(DirectoryName);&lt;/pre&gt;&lt;pre class="alt"&gt;  zip.Save();&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;Comprimir múltiples archivos en diferentes directorios:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Ionic.Utils.Zip; &lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Example2&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(String[] args)&lt;/pre&gt;&lt;pre&gt;  {&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;      &lt;span class="kwrd"&gt;using&lt;/span&gt; (ZipFile zip = &lt;span class="kwrd"&gt;new&lt;/span&gt; ZipFile(&lt;span class="str"&gt;"test2.zip"&lt;/span&gt;))&lt;/pre&gt;&lt;pre&gt;      {&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;        zip.AddItem(&lt;span class="str"&gt;"c:\\downloads\\vacaciones01.jpg"&lt;/span&gt;, &lt;span class="str"&gt;"images"&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;        zip.AddItem(&lt;span class="str"&gt;"c:\\Trabajo\\Specs_Lic2008.pdf"&lt;/span&gt;, &lt;span class="str"&gt;"files\\documents"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;        zip.AddItem(&lt;span class="str"&gt;"test2.cs"&lt;/span&gt;, &lt;span class="str"&gt;"files\\text"&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;/pre&gt;&lt;pre&gt;        zip.Save();&lt;/pre&gt;&lt;pre class="alt"&gt;      }&lt;/pre&gt;&lt;pre&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;catch&lt;/span&gt; (System.Exception ex1)&lt;/pre&gt;&lt;pre&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;      System.Console.Error.WriteLine(&lt;span class="str"&gt;"exception: "&lt;/span&gt; + ex1);&lt;/pre&gt;&lt;pre&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;  }&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;span style="font-weight:bold;"&gt;Extraer todo el contenido de un archivo .ZIP&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; (ZipFile zip = ZipFile.Read(zipfile))&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;  zip.ExtractAll();&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3629805769059546150-162411020689346440?l=kerzek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kerzek.blogspot.com/feeds/162411020689346440/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3629805769059546150&amp;postID=162411020689346440' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3629805769059546150/posts/default/162411020689346440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3629805769059546150/posts/default/162411020689346440'/><link rel='alternate' type='text/html' href='http://kerzek.blogspot.com/2008/04/crear-y-leer-archivos-zip-en.html' title='Crear y leer archivos ZIP en aplicaciones .Net'/><author><name>[?]</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3629805769059546150.post-138877637650934720</id><published>2008-04-14T00:39:00.035-03:00</published><updated>2008-04-16T01:44:26.834-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>ASP.Net - Leer el Web.Config desde una Class Library</title><content type='html'>Para leer el archivo Web.Config desde un proyecto del tipo Biblioteca de Clases, o Class Library, se necesita agregar una referencia a System.Web en el proyecto y cargarlo como un XML ordinario.&lt;br /&gt;La manera de obtener el path correcto es mediante la clase System.Web.HttpRuntime.AppDomainAppPath.&lt;br /&gt;&lt;br /&gt;[código]&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;// Obtengo el path de la raíz del sitio&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;string&lt;/span&gt; currentPath = System.Web.HttpRuntime.AppDomainAppPath.ToString(); &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;string&lt;/span&gt; _xmlConfigurationFullPath = Path.Combine(currentPath, &lt;span class="str"&gt;"Web.Config"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;// cargo el Web.Config &lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;XmlDocument xmlDoc = &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlDocument();&lt;/pre&gt;&lt;pre&gt;xmlDoc.Load(_xmlConfigurationFullPath);&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Se necesita importar los namespaces System.IO y System.XML. &lt;br /&gt;Notarán que uso el método estático Combine de la clase &lt;a href="http://msdn2.microsoft.com/en-us/library/system.io.path(VS.80).aspx"&gt;Path&lt;/a&gt; para abstraerme de la combinación de un path y un nombre de archivo, con lo cual se evita la validación de, por ejemplo, preguntar si el path es raíz de unidad o no (y su particular "\" al final). No es mucho, pero el Namespace System.IO tiene clases de gran utilidad para la manipulación de archivos y directorios. Muy cómodo la verdad.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3629805769059546150-138877637650934720?l=kerzek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kerzek.blogspot.com/feeds/138877637650934720/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3629805769059546150&amp;postID=138877637650934720' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3629805769059546150/posts/default/138877637650934720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3629805769059546150/posts/default/138877637650934720'/><link rel='alternate' type='text/html' href='http://kerzek.blogspot.com/2008/04/aspnet-leer-el-webconfig-desde-una.html' title='ASP.Net - Leer el Web.Config desde una Class Library'/><author><name>[?]</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3629805769059546150.post-5058350187260474458</id><published>2008-04-13T03:21:00.010-03:00</published><updated>2008-04-13T03:46:00.056-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blog'/><title type='text'>No enviar tu propio artículo a Menéame</title><content type='html'>Por supuesto que alguna vez había escuchado de &lt;a href="http://meneame.net/"&gt;Menéame&lt;/a&gt;, pero nunca había entrado. Se me ocurrió registrarme y ver de que se trataba. Para los que no saben de que se trata, &lt;a href="http://es.wikipedia.org/wiki/Meneame"&gt;así lo define Wikipedia&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Y no tuve mejor idea que enviar un artículo propio, apenas unos minutos después de crear el blog y todavía menos de registrarme en Menéame. Y eso no fue muy bien recibido por la comunidad del sitio.&lt;br /&gt;&lt;br /&gt;Moraleja: es obvia no?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_ArR7Q1Hgp3w/SAGn7P1LLwI/AAAAAAAAAAc/m39yFWEnMn0/s1600-h/Script+SQL+con+datos+de+una+tabla+-+meneame_net_story_script-sql-con-datos-de-tabla_best-comments.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_ArR7Q1Hgp3w/SAGn7P1LLwI/AAAAAAAAAAc/m39yFWEnMn0/s400/Script+SQL+con+datos+de+una+tabla+-+meneame_net_story_script-sql-con-datos-de-tabla_best-comments.png" alt="No enviar tu propio artículo a Menéame" id="BLOGGER_PHOTO_ID_5188612882011205378" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Links:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://meneame.net/story/script-sql-con-datos-de-tabla"&gt;Los comentarios en Meneame&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3629805769059546150-5058350187260474458?l=kerzek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kerzek.blogspot.com/feeds/5058350187260474458/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3629805769059546150&amp;postID=5058350187260474458' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3629805769059546150/posts/default/5058350187260474458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3629805769059546150/posts/default/5058350187260474458'/><link rel='alternate' type='text/html' href='http://kerzek.blogspot.com/2008/04/no-enviar-tu-propio-artculo-menarte.html' title='No enviar tu propio artículo a Menéame'/><author><name>[?]</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_ArR7Q1Hgp3w/SAGn7P1LLwI/AAAAAAAAAAc/m39yFWEnMn0/s72-c/Script+SQL+con+datos+de+una+tabla+-+meneame_net_story_script-sql-con-datos-de-tabla_best-comments.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3629805769059546150.post-324855898677570596</id><published>2008-04-12T01:30:00.001-03:00</published><updated>2008-04-12T08:23:10.518-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Scripts'/><title type='text'>Script SQL con datos de una tabla</title><content type='html'>Este es un script enormement útil que sirve para exportar una tabla solamente utilizando un script SQL.  Por ejemplo el contenido de una tabla podría quedar de la siguiente manera:&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; [Provincia] ([ID],[Nombre])&lt;span class="kwrd"&gt;VALUES&lt;/span&gt;(1,&lt;span class="str"&gt;'BUENOS AIRES'&lt;/span&gt;)&lt;br /&gt;&lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; [Provincia] ([ID],[Nombre])&lt;span class="kwrd"&gt;VALUES&lt;/span&gt;(2,&lt;span class="str"&gt;'CATAMARCA'&lt;/span&gt;)&lt;br /&gt;&lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; [Provincia] ([ID],[Nombre])&lt;span class="kwrd"&gt;VALUES&lt;/span&gt;(3,&lt;span class="str"&gt;'CHACO'&lt;/span&gt;)&lt;br /&gt;&lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; [Provincia] ([ID],[Nombre])&lt;span class="kwrd"&gt;VALUES&lt;/span&gt;(4,&lt;span class="str"&gt;'CHUBUT'&lt;/span&gt;)&lt;br /&gt;&lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; [Provincia] ([ID],[Nombre])&lt;span class="kwrd"&gt;VALUES&lt;/span&gt;(5,&lt;span class="str"&gt;'CORDOBA'&lt;/span&gt;)&lt;br /&gt;&lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; [Provincia] ([ID],[Nombre])&lt;span class="kwrd"&gt;VALUES&lt;/span&gt;(6,&lt;span class="str"&gt;'CORRIENTES'&lt;/span&gt;)&lt;br /&gt;&lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; [Provincia] ([ID],[Nombre])&lt;span class="kwrd"&gt;VALUES&lt;/span&gt;(7,&lt;span class="str"&gt;'ENTRE RIOS'&lt;/span&gt;)&lt;br /&gt;&lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; [Provincia] ([ID],[Nombre])&lt;span class="kwrd"&gt;VALUES&lt;/span&gt;(8,&lt;span class="str"&gt;'FORMOSA'&lt;/span&gt;)&lt;br /&gt;&lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; [Provincia] ([ID],[Nombre])&lt;span class="kwrd"&gt;VALUES&lt;/span&gt;(9,&lt;span class="str"&gt;'JUJUY'&lt;/span&gt;)&lt;br /&gt;&lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; [Provincia] ([ID],[Nombre])&lt;span class="kwrd"&gt;VALUES&lt;/span&gt;(10,&lt;span class="str"&gt;'LA PAMPA'&lt;/span&gt;)&lt;br /&gt;&lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; [Provincia] ([ID],[Nombre])&lt;span class="kwrd"&gt;VALUES&lt;/span&gt;(11,&lt;span class="str"&gt;'LA RIOJA'&lt;/span&gt;)&lt;br /&gt;&lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; [Provincia] ([ID],[Nombre])&lt;span class="kwrd"&gt;VALUES&lt;/span&gt;(12,&lt;span class="str"&gt;'MENDOZA'&lt;/span&gt;)&lt;br /&gt;&lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; [Provincia] ([ID],[Nombre])&lt;span class="kwrd"&gt;VALUES&lt;/span&gt;(13,&lt;span class="str"&gt;'MISIONES'&lt;/span&gt;)&lt;br /&gt;&lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; [Provincia] ([ID],[Nombre])&lt;span class="kwrd"&gt;VALUES&lt;/span&gt;(14,&lt;span class="str"&gt;'NEUQUEN'&lt;/span&gt;)&lt;br /&gt;&lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; [Provincia] ([ID],[Nombre])&lt;span class="kwrd"&gt;VALUES&lt;/span&gt;(15,&lt;span class="str"&gt;'RIO NEGRO'&lt;/span&gt;)&lt;br /&gt;&lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; [Provincia] ([ID],[Nombre])&lt;span class="kwrd"&gt;VALUES&lt;/span&gt;(16,&lt;span class="str"&gt;'SALTA'&lt;/span&gt;)&lt;br /&gt;&lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; [Provincia] ([ID],[Nombre])&lt;span class="kwrd"&gt;VALUES&lt;/span&gt;(17,&lt;span class="str"&gt;'SAN JUAN'&lt;/span&gt;)&lt;br /&gt;&lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; [Provincia] ([ID],[Nombre])&lt;span class="kwrd"&gt;VALUES&lt;/span&gt;(18,&lt;span class="str"&gt;'SAN LUIS'&lt;/span&gt;)&lt;br /&gt;&lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; [Provincia] ([ID],[Nombre])&lt;span class="kwrd"&gt;VALUES&lt;/span&gt;(19,&lt;span class="str"&gt;'SANTA CRUZ'&lt;/span&gt;)&lt;br /&gt;&lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; [Provincia] ([ID],[Nombre])&lt;span class="kwrd"&gt;VALUES&lt;/span&gt;(20,&lt;span class="str"&gt;'SANTA FE'&lt;/span&gt;)&lt;br /&gt;&lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; [Provincia] ([ID],[Nombre])&lt;span class="kwrd"&gt;VALUES&lt;/span&gt;(21,&lt;span class="str"&gt;'SANTIAGO DEL ESTERO'&lt;/span&gt;)&lt;br /&gt;&lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; [Provincia] ([ID],[Nombre])&lt;span class="kwrd"&gt;VALUES&lt;/span&gt;(22,&lt;span class="str"&gt;'TIERRA DEL FUEGO'&lt;/span&gt;)&lt;br /&gt;&lt;span class="kwrd"&gt;INSERT&lt;/span&gt; &lt;span class="kwrd"&gt;INTO&lt;/span&gt; [Provincia] ([ID],[Nombre])&lt;span class="kwrd"&gt;VALUES&lt;/span&gt;(23,&lt;span class="str"&gt;'TUCUMAN'&lt;/span&gt;)&lt;/pre&gt;Para realizar esto Vyaskn creó un stored procedure al que se le pasa como parámetro el nombre de la tabla. El SP está &lt;span style="font-style: italic;"&gt;sobrecargado &lt;/span&gt;y permite otros diez parámetros opcionales para afinar los resultados.&lt;br /&gt;&lt;br /&gt;Lo único que se tiene que hacer es crear el SP (para &lt;a href="http://vyaskn.tripod.com/code/generate_inserts.txt"&gt;SQL 2000&lt;/a&gt; ó para &lt;a href="http://vyaskn.tripod.com/code/generate_inserts_2005.txt"&gt;SQL 2005&lt;/a&gt;), ver los resultados como texto, no como grilla y listo.&lt;br /&gt;&lt;br /&gt;Una cosa, si no tienen permisos para exportar datos no hagan mal uso de este script :-D&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Links:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://vyaskn.tripod.com/code/generate_inserts.txt"&gt;GenerateInserts Stored Procedure para SQL 2000&lt;/a&gt;&lt;br /&gt;&lt;a href="http://vyaskn.tripod.com/code/generate_inserts_2005.txt"&gt;GenerateInserts Stored Procedure para SQL 2005&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3629805769059546150-324855898677570596?l=kerzek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kerzek.blogspot.com/feeds/324855898677570596/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3629805769059546150&amp;postID=324855898677570596' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3629805769059546150/posts/default/324855898677570596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3629805769059546150/posts/default/324855898677570596'/><link rel='alternate' type='text/html' href='http://kerzek.blogspot.com/2008/04/script-sql-con-los-datos-de-una-tabla.html' title='Script SQL con datos de una tabla'/><author><name>[?]</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3629805769059546150.post-2400728801505469834</id><published>2008-04-11T23:10:00.000-03:00</published><updated>2008-04-12T01:30:23.373-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Scripts'/><title type='text'>Script SQL de provincias y localidades argentinas</title><content type='html'>Programando, muchas veces tuve la necesidad de presentar al usuario un listado de provincias, ciudades y localidades, pero lo tenía que implementar presentando al usuario las provincias y dejarle la tarea al usuario de ingresar las ciudades/localidades mediantes respectivos ABMs.&lt;br /&gt;&lt;br /&gt;La solución, hice un un script SQL para hacerme la vida más fácil obteniendo datos de excel y archivos de texto.&lt;br /&gt;El script es lo que yo denomino un "&lt;span style="font-weight: bold; font-style: italic;"&gt;insert script&lt;/span&gt;", o sea un "insert into.." para cada registro.&lt;br /&gt;&lt;br /&gt;Los datos están separados en tres tablas [Provincia] -&gt; [Departamento] -&gt; [Localidad]&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cantidad de registros:&lt;/span&gt;&lt;br /&gt;Provincias: 23&lt;br /&gt;Departamentos: 574&lt;br /&gt;Localidades: 5439&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mediafire.com/?hmbjwyjmdgx"&gt;Descargar archivo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_ArR7Q1Hgp3w/SAA55SPwUCI/AAAAAAAAAAU/3muF6PV1L_o/s1600-h/DER.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_ArR7Q1Hgp3w/SAA55SPwUCI/AAAAAAAAAAU/3muF6PV1L_o/s320/DER.jpg" alt="" id="BLOGGER_PHOTO_ID_5188210427044057122" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3629805769059546150-2400728801505469834?l=kerzek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kerzek.blogspot.com/feeds/2400728801505469834/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3629805769059546150&amp;postID=2400728801505469834' title='15 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3629805769059546150/posts/default/2400728801505469834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3629805769059546150/posts/default/2400728801505469834'/><link rel='alternate' type='text/html' href='http://kerzek.blogspot.com/2008/04/script-sql-de-provincias-y-localidades.html' title='Script SQL de provincias y localidades argentinas'/><author><name>[?]</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_ArR7Q1Hgp3w/SAA55SPwUCI/AAAAAAAAAAU/3muF6PV1L_o/s72-c/DER.jpg' height='72' width='72'/><thr:total>15</thr:total></entry></feed>
