domingo, 31 de marzo de 2013

Indices base datos

El minuto de hoy: Tengo una consulta que tarda más de 3min. Ejecutando el plan de ejecución me dice que debería tener un índice más (hasta aquí todo normal).
Cuando veo el índice que me sugiere :
CREATE NONCLUSTERED INDEX [miindice]
ON [dbo].[mitabla] ([codigo],[nombre])
INCLUDE ([fecha], [cantidad])
Qué es esto??
Vaya hasta el momento (para mi) un índice era un conjunto de columnas. Resulta que ya no es así
existe el crear índices con columnas incluidas
MSDN
Por cierto con el índice la consulta mejoro en más de un 50% el tiempo

jueves, 21 de marzo de 2013

Servidores Vinculados SQLServer

Bueno últimamente nos ha tocado trabajar con servidores vinculados

Ambos servidores se ven:
En servidor1 está mibase1 donde esta mitabla1 con su columna nombredoc1 --> no es case-sensitive
En servidor2 está mibase2  donde esta mitabla2 con su columna nombredoc2 --> es case-sensitive

Si en servidor1 ejecuto
select top 1  NOMBREDOC2  from servidor2. mibase2 .dbo. mitabla2 --> ok
select top 1  nombredoc2  from servidor2. mibase2.dbo. mitabla2 --> ok
Si en servidor2 hago
select top 1  NOMBREDOC1  from servidor1. Mibase1 .dbo. mitabla1 -->  error
select top 1  nombredoc1  from servidor1. Mibase1.dbo. mitabla1--> ok

Lo ha configurado para que sea case-sensitive hasta el nombre de las columnas!!!!

La configuración es importante, pero si lo pones a nivel de estructura mira las implicaciones (sobre todo en una migración)

Pregunta es ¿Si se puede tener la BD definida como  case sensible y consultas NO?

Respuesta es :  hay que crear la BD como case no sensible y tablas columnas como sensibles


http://msdn.microsoft.com/en-us/library/ms143508(v=sql.105).aspx


SQL Server 2008 supports setting collations at the following levels:
•         Server
•         Database
•         Column
•         Expression


http://msdn.microsoft.com/en-us/library/ms187053(v=sql.90).aspx

Parameters for stored procedures or functions, alias data types, and variables are assigned the default collation of the database. To change the collation of an alias type, you must drop and re-create it.

Problemas de rendimiento


Servidor 2
select distinct a.fecha , a.nif ,
b.nombre  from basedatos2.dbo.tabla2 a ,servidor1.base1.dbo.tabla1 b
where a.nif = b.nif   and a.fecha = '08/10/2012' order by b.nombre asc --> 6sg
Servidor 1
select distinct a.fecha , a.nif ,
b.nombre  from servidor2.basedatos2.dbo.tabla2 a , base1.dbo.tabla1 b
where a.nif = b.nif  and a.fecha = '08/10/2012' order by b.nombre asc --> IMEDIATO
Para que vaya rápido en el servidor2
select distinct a.fecha , a.nif ,
b.nombre  from basedatos2.dbo.tabla2 a , openquery(servidor1, 'select * from base1.dbo.tabla1')  b
where a.nif = b.nif   and a.fecha = '08/10/2012' order by b.nombre asc -->INMEDIATO

Las soluciones posibles :
- mejorar las estructura de la consulta, (índices,  openquery)
- replicar la base de datos  Replicar las base de datos ( http://www.sqlservercentral.com/articles/Linked+Server/62246/)

La "chapu" para cuando vas fatal de tiempo  es aumentar el tiempo de time-out de las consultas de tu código

domingo, 10 de marzo de 2013

Informes, reports..


Lo reconozco odio hacer informes, me da igual el método

Hoy tenía 5min de descanso y he visto un link muy interesante
Generar archivos Excel como un señor con ClosedXml

Yo también lo reconozco en modo web también he cambiado el content-type

Para generar Word en el CodePlex Docx

Hace algunos años (más de 3) estos link me salvaron de un apuro
http://www.codeproject.com/KB/reporting-services/Reporting_ServicesByalifaraze.aspx

Para exportar a Word el report
http://www.codeproject.com/KB/reporting-services/report-viewer-hack.aspx

Localizador o multidioma en los report generados con el .net
http://www.codeproject.com/KB/aspnet/RDLC_Localization.aspx

Este link genial, uno se da cuenta lo que desconoce el office, lo reconozco es una locura, pero funciona.
Resumen: creas lo objetos, con ellos obtienes  el xsd para asociar al word. Hasta imágenes inserte en su día
http://www.codeproject.com/Articles/20287/Generating-Word-Reports-Documents
Más info
http://sophinet.wordpress.com/2011/03/10/open-xml/

Por si no lo sabes el Open Office no deja de ser un fichero comprimido. Apuesto que alguno no se lo cree…
Haz la prueba:
  1. Guarda un documento (me da igual Word o Excel, con la extensión .docx o .xlsx)
  2. Cambia la extensión por .zip
  3. Luego dar a ver que hay dentro.

viernes, 15 de febrero de 2013

VS & Nuget


NuGet es un add-in para Visual Studio 2010 y es un gestor de paquetes que permite instalar y configurar librerias y herramientas para utilizarlas dentro de nuestros proyecto

Información :
http://eduardosojo.com/2011/07/19/usuando-nuget-que-es-nuget/

http://docs.nuget.org/docs/start-here/using-the-package-manager-console

Cuando hay problemas que los tendremos

http://geeks.ms/blogs/fernandezja/archive/2012/05/22/vs2010-sp1-nuget-actualizaci-243-n-manual-de-nuget-copiando-y-pegando-archivos-cuando-tenemos-problemas-en-la-instalaci-243-n-actualizaci-243-n-en-vs2010-sp1.aspx

Muy útil para descargar el Sandcastle

La primera versión me instale el Sandcastle con el NutGet pero he querido hacer lo mismo en las máquinas de mis compañeros y fue imposible .. claro esto fue 3 años después

La buena noticia es que hay un msi
https://github.com/EWSoftware/SHFB/releases

1 el SandcastleHelpFileBuilder.msi
2 SHFBVisualStudioPackage.vsix

documentación : http://ewsoftware.github.io/SHFB/html/8c0c97d0-c968-4c15-9fe9-e8f3a443c50a.htm

Sinceramente, soy partidaria de hacer documentación, sobre todo para luego funcione el IntelliSense. Pero para que será útil, hay que hacerla según se hace el código. Pero si tu jefe quiere documentación para entregar esto es una buena solución


TFS - Team Foundation Sidekicks

Ahora trabajamos con TFS, en realidad y de momento únicamente lo usamos con control de código, antes usamos el Visual Source Safe (o VSS). Hay cosas que das por hechas, en el VSS nunca función bien a la hora de buscar quien tenía las cosas protegidas, pero con el paquete básico de TFS esa posibilidad ni siquiera la tienes ups!!!!. No queda más remedio que instalar una utilidad Team Foundation Sidekicks.. y problema resuelto Ok






viernes, 18 de enero de 2013

Super control de usuario

Los controles de usuario de Windows

Hoy ha pasado una cosa curiosa, un compi había creado una control de usuario que en el load hacia una consulta a la base de datos. Hasta aquí todo parece normal. Lo que ya no lo era tanto era si:
  1. Compilabas el proyecto
  2. En el Designer del formulario que lo contenía, en modo diseño se ejecutaba la consulta!!!
Por lo visto no es tan novedoso, aquí un ejemplo explicado lo mismo pero para el evento paint http://el-blog-de-thor.blogspot.com.es/2009/09/infectar-codigo-fuente.html

lunes, 14 de enero de 2013

DateTime.Parse & Marzo

Hoy hemos visto un error super curioso, leemos un fichero plano donde las fechas llegan con el formato dd-MMM-yy ( el formato no está decidió por nosotros)

Resulta que en una aplicación

fecha = DateTime.Parse("20-JAN-09") funciona
fecha = DateTime.Parse("20-MAR-09") falla No se puede reconocer la cadena como valor DateTime válido.

El problema parece ser en que no sabe si “MAR” es Marzo o Martes y da un error que no puede convertir la fecha, puesto que nuestro sistema operativo está en español la referencia cultural que está usando es “es”

Solución , usar DateTime.Parse con referencia cultural o DateTime.ParseExact (incluye el formato)

https://connect.microsoft.com/VisualStudio/feedback/details/729674/datetime-parse-fails-to-parse-correct-dates-or-accepts-incorrect-dates


Por si aun tienes curiosidad

Try
Dim fecha As DateTime
fecha = DateTime.Parse("20-JAN-09")
' falla ---> fecha = DateTime.Parse("20-MAR-09")
fecha = DateTime.ParseExact("20-MAR-09", "dd-MMM-yy", System.Globalization.CultureInfo.GetCultureInfo("en-US"), System.Globalization.DateTimeStyles.None)
fecha = DateTime.Parse("20-MAR-09", System.Globalization.CultureInfo.GetCultureInfo("en"), System.Globalization.DateTimeStyles.None)
fecha = DateTime.Parse("20-MAR-09", System.Globalization.CultureInfo.GetCultureInfo("en"))
fecha = DateTime.Parse("20-JAN-09", System.Globalization.CultureInfo.GetCultureInfo("es"))
' falla fecha = DateTime.Parse("20-MAR-09", System.Globalization.CultureInfo.GetCultureInfo("es"))
fecha = DateTime.ParseExact("20-MAR-09", "dd-MMM-yy", System.Globalization.CultureInfo.GetCultureInfo("es"), System.Globalization.DateTimeStyles.None)
fecha = DateTime.Parse("20-APR-09", System.Globalization.CultureInfo.GetCultureInfo("es"))
'falla --> fecha = DateTime.Parse("20-AVR.-09", System.Globalization.CultureInfo.GetCultureInfo("es"))
fecha = DateTime.Parse("20-APR-09", System.Globalization.CultureInfo.GetCultureInfo("fr"))
Catch ex As Exception

End Try

Me sorprendió que
fecha = DateTime.Parse("20-APR-09", System.Globalization.CultureInfo.GetCultureInfo("es"))

Funciona!!!!   El formato no es español, pero según la documentación

Este método intenta analizar s completamente para evitar que se produzca FormatException. Si es posible, omite los datos no reconocidos y rellena la información que falta acerca de mes, día y año con la hora actual. Si s contiene sólo una fecha y ninguna hora, este método supone que es medianoche (00:00). Se omiten los caracteres de espacio en blanco iniciales, centrales o finales que pueda haber en s. La fecha y la hora pueden ir entre corchetes con un par de caracteres NUMBER SIGN iniciales y finales ('#', U+0023) y pueden terminar con uno o más caracteres NULL (U+0000).”


Para evitar el FormatException, termina usando la InvariantCulture (que está en inglés) y por eso funciona