miércoles, 30 de junio de 2010

Copia de seguridad de tablas. Rápidamente.

Quiero hacer una copia de seguridad de una tabla que voy a modificar y no quiero liarme con el backup de la base de datos entera:

SELECT * INTO <nombre de la nueva tabla> FROM <tabla original>

Con esta sentencia guardamos toda la tabla original en una idéntica con el nuevo nombre, que se crea automáticamente.

Moooola!!

jueves, 24 de junio de 2010

Conversion failed when converting the nvarchar value <string> to data type int.

Bonito error cuando me estoy trayendo, para cargar un GridView, el nombre, primer y segundo apellido de una persona y le añado por delante el identificador.

La cadena que yo esperaba que me funcionara era:
QM_Conductores.id + ' - ' + QM_Conductores.nombre + ' ' + QM_Conductores.apellido1 + ' ' + QM_Conductores.apellido2 AS Conductor

Y la que funciona bien es:
CAST (QM_Conductores.id AS VARCHAR(3)) + ' - ' + QM_Conductores.nombre + ' ' + QM_Conductores.apellido1 + ' ' + QM_Conductores.apellido2 AS Conductor

¿El truco? La necesidad de realizar la conversión explicita del tipo entero a varchar para entonces poder utilizar el operador de concatenación (+).

Suerte y al toro!!

viernes, 11 de junio de 2010

Un cargando general en Ajax.net y CSS

Mi compañero de equipo (Borja) me pasó un código que con JavaScript y código .net me ponía una capa de cargando en toda la aplicación… pero que al tener JS no me gustaba un pelo. Si, tengo la deformación de huir del Javascript como del agua caliente.
Por lo cual le estuve dando vueltas y al final con una masterpage y una hoja de estilos (.css) obtuve el mismo resultado para todos los updatespanel de la aplicación.
Primer paso: crear el estilo que va a definir la capa, de cargando, en el fichero estilo.css.
/* Panel de Cargando */
.CargandoModalBackground
{
    background-color: #FFFFFF;
    filter: alpha(opacity=70);
    opacity: 0.2;
    position: absolute;
    top: 0px;
    left: 0px;
    text-align: center;
    vertical-align: middle;
    padding-top: 20%;
    padding-bottom: 36%;
    padding-left: 45%;
    padding-right: 51%;
}
De aquí señalar que no se consideran estándar las claves filter y opacity, pero que en IE8/7 lo visualiza sin problemas.
A continuación, en la MasterPage linkamos el documento de estilo.
<head runat="server">
    <
title></title>
    <
link href="estilos.css"rel="stylesheet"type="text/css" />
</
head>

A continuación del ContentPlaceHolder, para que se visualice por encima del contenido, definimos un UpdateProgress con la capa de cargando en su interior.
<asp:UpdateProgress ID="UpdateProgress1" runat="server">
    <
ProgressTemplate>
        <
div class="CargandoModalBackground">
            <
img src="imagenes/ajax-loader.gif" alt="Cargando..." />
           
Cargando...
        </div>
    </
ProgressTemplate>
</
asp:UpdateProgress>

Y ya ta!.
Cada vez que un UpdatePanel se lance para ser actualizado, invocará al UpdateProgress y nuestra capa de cargando ocupará toda la pantalla, con el icono más o menos en el medio.
Si acaso lo que tengo que señalar es que consigo que la capa utilice toda la pantalla, a pesar de que la imagen es muy pequeña, manipulando las propiedades de padding.
Espero sea útil.

martes, 1 de junio de 2010

Listados inversos con Linq

Poco a poco me encanta cada vez más Linq.

Una cosa que es harto complicada de obtener por medio de SQL o con ADO, con Linq es muy sencillito: teniendo un listado de máquinas, obtener todas aquellas que no estén asignadas a un proyecto dado.
/// <summary>
/// Returns a list with all the machines assigned to a project
/// </summary>
/// <param name="pDataContext">Datacontext where the objects are loaded</param>
/// <param name="pIdProject">ID of the project</param>
/// <returns>A list with the elements</returns>
public static IQueryable<Maquina> GetMachineListNotProject(QTestDataContext pDataContext, int pIdProject)
{
//First recover the machines ASSIGNED to the project
IQueryable<Maquina> assignedList = GetMachineList(pDataContext, pIdProject);

//Now select those machines not in the previous list
return pDataContext.Maquina.Where(ob => !(assignedList.Contains(ob))).Select(ob => ob);
}


Me encanta.

Primero me traigo la lista de todas las máquinas y después selecciono aquellos que no estén contenido en dicho listado.

Simple y funcional.

Ahora solo quedaría traducirlo de expresiones lambda a Linq.


P.D. El uso del DataContext y el que esté en inglés es por el motivo que es una pieza de código de un proyecto real.