miércoles, 6 de marzo de 2013

Merge en CSharp

Se me presento un problema al realizar el Merge de dos tablas, pues llegaba un momento en el cual los nuevos datos que queria agregar a la tabla principal, de la tabla nueva, me duplicaba las columnas. Esto me complicaba luego cuando queria trabajar con los datos de la tabla, pues al tener columnas duplicadas ya se imaginaran que sucederia.
La solución fue especificarle los siguientes parámetros:
dtPrincipal.Merge(dtSecundaria,true,MissingSchemaAction.Ignore);

dtPrincipal = DataTable principal donde estamos almacenando la información.
dtSecundaria = DataTable secundaria donde tenemos los datos

Documentos en Tortoise

Para consultar los enlaces de los documentos en tortoise, que nos envian los coordinadores, se debe realizar lo siguiente:

  • Clic derecho en el escritorio.
  • Seleccionamos el Tortoise - Repo-Browser.
  • En la ventana emergente URL, copiamos el enlace del documento que nos enviaron por correo.
  • Clic en OK
  • Si pide username y password, lo digitamos.
  • Nos muestra el documento.
  • Lo descargamos localmente para que lo podamos ver o le damos open with y elegimos el programa para abrir el documento.

Sacar Copia Caso de Uso EA

Para sacar una copia a un caso de uso del EA, se posiciona en el caso de uso, le damos clic derecho y seleccionamos las opciones mostradas en la imagen:


Asignar botones a notas del historico

Cada nota del histórico debe llevar ciertas configuraciones, por ejemplo, para asignar botones a una nota del histórico, seguimos los siguientes pasos:

  1. En la entidad Messages-ClinicDocumentEntity, creamos los comandos para manejar los métodos que van a disparar el hacer clic en el botón. Estos comandos los creamos como propiedades.
  2. En la misma entidad creamos unas boleanas de visibilidad, para saber si se estarán disponibles los botones o no. Estas boleanas las creamos como propiedades, las cuales van a disparar el evento de cambio de valor, tanto para la boleana sola, como la de la boleanda de mostrar comando.
  3. Se crea en el DynamicTemplateHelper dependiendo del código del comando, configuramos estos en el texto estructurado.
  4. En el componente del histórico de notas, se agregan al bindeo de los comandos el respectivo comando y creamos su respectivo método que va hacer lo que le corresponde.

viernes, 1 de marzo de 2013

Solucionar Bloqueos en Tablas SQL Server


Resulta que cuando una tabla es muy utilizada (muchas consultas), o cuando se “cruzan” las transacciones sobre la misma tabla, se produce un bloqueo a nivel de tabla, lo que hace que ya no se puedan realizar más consultas. 
Según lo que leí (inicialmente en blog.andr3z.org y luego en otros lugares), existen 2 posibles soluciones al problema:
  •  Modificar la consulta para saltarnos el bloqueo
  • Intentar resolver el bloqueo de la tabla

Cada solución tiene su propio alcance, sus pros y contras, veamos cada solución en detalle:

  • Solución 1: Modificar la consulta para “saltar” el bloqueo:


    Ámbito: No se desbloquea la tabla, solo se devuelven los resultados

    Pros: Permite realizar el SELECT sin restricción.

Contras: Puede retornar resultados fuera del Committed de la base de datos (es decir que los resultados pueden no ser fidedignos)

Para implementar esta solución, basta modificar el SELECT de la consulta, agregando el modificador WITH (NOLOCK), lo que hará que se omita el bloqueo de la tabla:

SELECT Field1, Field2,… FieldN FROM [Mi_Tabla] WITH (NOLOCK) WHERE …

  • Solución 2: Intentar resolver el bloqueo de la tabla:

    Ámbito: Se intenta resolver el bloqueo.
Pros: Se resuelve definitivamente el bloqueo (por lo menos hasta que se vuelva a producir un bloqueo nuevo en la misma tabla)

    Contras: Requiere tener acceso/permisos para “Matar” procesos (incluso de otros usuarios).

Para esta solución, SQL server provee un procedimiento almacenado que muestra los bloqueos en curso: sp_lock.

Basta con ejecutar:

Execute sp_lock

Para ver los bloqueos activos en la base de datos.

Cabe mencionar que adicionalmente SQL Server también provee 2 procedimientos que permiten listar los procesos que están consumiendo muchos recursos: sp_who o sp_who2 siendo este último el que provee más detalles.

Una vez se ha identificado cual es el proceso que esta provocando el bloqueo, se puede proceder a “Matar” dicho proceso utilizando la información que arrojan los procedimientos ya mencionados (básicamente se requiere el ID del proceso que se va a matar).

Ejecutar: 

Kill <id_del_proceso_a_matar>

Bueno, pues eso era todo, como siempre, espero que esta información llegue a ser útil para alguno de ustedes.

Fuente: eklectopia