miércoles, 26 de mayo de 2010

IsFecha. Un IsDate en C# para fechas en es-ES

Las malditas fechas en conjunción con el IIS y el SQL pueden causar más de un dolor de cabeza a cualquiera :)

Por eso me he echo una función similar al IsDate de Visual Basic.Net pero para C# y que me permite identificar una fecha en formato dd/MM/yyyy en cualquier idioma del servidor.

/// <summary>
///
Comprueba si el valor es una fecha.
/// </summary>
/// <param name="cadenaFecha"></param>
/// <returns>
Se comprueba en la Cultura es-ES (España).</returns>
static public Boolean IsFecha (string cadenaFecha)
{
CultureInfo es = new CultureInfo("es-ES");
DateTime fechaTemp;

return DateTime.TryParseExact(cadenaFecha, "dd/MM/yyyy", es, DateTimeStyles.AdjustToUniversal, out fechaTemp);
}


Y aquí otro método para realizar la conversión de texto en un objeto DateTime que también se pase por el arco de la gloría el idioma del SO del servidor o del IIS.


/// <summary>
///
Convierte una cadena en fecha. Si falla en la conversión devuelve la fecha actual.
/// </summary>
/// <param name="fecha"></param>
/// <returns></returns>
static public DateTime convierteEnFecha(string fecha)
{
CultureInfo es = new CultureInfo("es-ES");
DateTime fechaTemp = DateTime.Now;

if (DateTime.TryParseExact(fecha, "dd/MM/yyyy", es, DateTimeStyles.None, out fechaTemp) == false)
{ fechaTemp = DateTime.Now; }

return fechaTemp;
}

Ahora a investigar si cambiando la cultura de toda la web me valdría… :)

Database is in transition...Error 952

Hay cosas que no entiendo porqué funcionan, y que cuando no funcionan  cascan el SQL Server 2005.

A causa de un USE mal puesto en un script le hice un DROP a varias bases de datos…!! A lo cual me dispuse a restaurarla, a lo cual me dice el servidor que nanai, que esa base de datos tiene conexiones activas.

A lo cual le digo que la ponga offline… a lo cual el servidor se vuelve loco y ni la deja offline ni la deja de ninguna forma. Simplemente no hay forma de acceder a ella:

Database is <database> in  transition...Error 952

Con el equipo mirando las musarañas y las paredes, corro y hago un restore en otra base de datos y, mientras, busco en San Google alguna solución. Y en los foros de SQL Server de MSDN la encontré:

Subes al nivel del motor de base de datos y abres una nueva pestaña de script. Lo primero es encontrar cuales son los procesos abiertos en la SQL:

EXEC sp_who2;

En el listado de procesos hay que buscar el que esté en estado SUSPEND y, comprobando que está relacionado con nuestra base de datos o el usuario de conexión, le buscamos el identificador o PID.

A continuación le decimos que mate el proceso con:

KILL <pid>;

Y deberíamos acceder de forma inmediata a nuestra base de datos. (hacer un backup).