jueves, 4 de noviembre de 2010

Culturización de Sitio Web

Si tienes algún web que utiliza los archivos de recursos locales para mostrar la interfaz en varios idiomas, esta entrada te puede ser de utilidad.

Normalmente este tipo de sitios lo que hacen es tomar la configuración de idioma predeterminados en el navegador, pero puede ser que el usuario desee mostrar otro idioma de los que se tienen disponibles. Para hacer esto basta con hacer que nuestro sitio agregué en el QueryString (mediante algún link u otro control semejante) el CultureName que deseamos utilizar y sobrescribir el método InitializeCulture como se muestra a continuación:
De esa manera, el sistema cargara el idioma Inglés como predeterminado, a menos que en el parámetro lang se indique otra cosa.
protected override void InitializeCulture()
{
   string Lang = "en-US";

   try
   {
      Lang = Request.QueryString["lang"].ToString();
      Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Lang);
      Thread.CurrentThread.CurrentUICulture = new CultureInfo(Lang);
   }
   catch { }

   base.InitializeCulture();
}

martes, 19 de octubre de 2010

Reducir archivo de Log de una Base de Datos

Me ha ocurrido, incluso después de ejecutar el plan de mantenimiento, que me he encontrado con que el log de alguna base de datos aun esta de gran tamaño. El siguiente script me ha ayudado a reducir el archivo al tamaño indicado. Espero les sea de utilidad.


USE NombreBaseDatos
BACKUP LOG NombreBaseDatos WITH TRUNCATE_ONLY
DBCC SHRINKFILE (NombreArchivoLog, TamañoArchivoEnMB)

Nota: No olviden, en caso de que lo requieran, realizar un backup previo del log, puesto que este procedimiento NO GENERA UN RESPALDO.

jueves, 30 de septiembre de 2010

Cambio de Login a Usuario en una Base de Datos

En varias ocasiones había tenido que remover la autorización de algún usuario a una base de datos, generalmente porque importaba el usuario con la base y este quedaba sin cuenta de Login. El día de hoy encontré por la web como corregir este pequeño error al ejecutar el Stored Procedure del sistema sp_change_users_login.

A continuación describo como se utiliza:
USE NombreBaseDatos
EXEC sp_change_users_login 'Update_One', 'NombreUsuario', 'LoginUsuario'

lunes, 6 de septiembre de 2010

Cambio de Cadenas de Conexión por Server

Uno de los problemas que se me presentaban constantemente cuando comencé en esto del desarrollo en .net, era que al publicar un proyecto del entorno de desarrollo al entorno de producción, olvidaba corregir la cadena de conexión.

Ya sé que no a cualquiera le pasa, y hasta es posible que algún framework ya cuente con alguna solución para esto, pero como no las conozco, opte por la solución más lógica: declarar una cadena de conexión por servidor. A continuación muestro como hacerlo.
  1. En el Web.Config del sitio agregamos una cadena de conexión por cada servidor que utilizamos (con el mismo nombre que el servidor):
       <connectionstrings>
           <add name="MiServer1" connectionString="Data Source…" >
           <add name="MiServer2" connectionString="Data Source…" >
       </connectionstrings>
  2. Agregamos en el código de cada página que requiera acceder a las cadenas de conexión la biblioteca System.Configuration
  3. En lugar de utilizar directamente el nombre o incluso el ConnectionString tomamos el nombre del server con la instrucción Page.Server.MachineName de modo que quedaría de la siguiente manera:
    MiDataSource.ConnectionString = ConfigurationManager.ConnectionStrings[Page.Server.MachineName].ToString()
De este modo la cadena que se utilizara siempre corresponderá al nombre del servidor, de modo que no tendrás que modificar el Web.Config cuando la aplicación sea publicada.

martes, 31 de agosto de 2010

Resolver el error: DataBinding: 'Telerik.Web.UI.GridInsertionObject' no contiene una propiedad con el nombre X

Aunque ya he visto la solución en varios blogs (por ejemplo aquí) e incluso en el foro de soporte de Telerik, cada vez que me ocurría tenía que buscarlo y volver a leer todo el rollo. Asi que directo y sin escalas, el problema se soluciona de la siguiente manera:
  1. Se agrega al RadGrid el evento ItemCommand
  2. Dentro del evento se valida si el evento es InitInsert
  3. Si es el caso, se cancela el evento y se agregan valores por default en cada columna que diga no contener el objeto.
A continuación agrego el código de ejemplo (por si mi elocuente explicación no dice ni madres):
protected void RadGrid_ItemCommand(object source, GridCommandEventArgs e)
{
   if (e.CommandName == RadGrid.InitInsertCommandName)
   {
     e.Canceled = true;
     System.Collections.Specialized.ListDictionary Valores = new System.Collections.Specialized.ListDictionary();
     Valores.Add("IdMarca", "0");
     Valores.Add("IdCategoria", "0");
     e.Item.OwnerTableView.InsertItem(Valores);
   }
}

Inauguración

Desde que comencé con este de la programación, siempre he tenido una bitácora donde documento problemas comunes, trucos y demás ocurrencias. Aunque pareciera que es por nostálgico, esto lo hago para facilitar la chamba y tener mi propia Base de Conocimientos.

Con el objetivo de no solo hacer un montón de apuntes que quizás luego extravié, ahora llevare esa bitácora en este blog, esperando que les sea de utilidad y sea una oportunidad de intercambiar conocimientos.

Sin más preámbulo, bienvenidos sean al blog.