lunes, 31 de agosto de 2009

SQL Server 2008 R2 y mi BD de Producción

Atención, si instaláis la actualización a SQL Server 2008 R2 CTP y atacháis una BD en Producción (digo esta porque es la más importante por el destrozo que puede ocasionar xDDD, pero vale para cualquiera), que sepáis, que si luego os arrepentís y volvéis a SQL Server 2008 SP1 o RTM, no os dejará atachar ni restaurar la BD. El problema radica en que cambia la versión física de la BD a 660 mientras que nuestra BD en SQL Server 2008 SP1 está en una versión 655.

Esto no lo digo yo, lo dice mi amigo Paul Randal, así que hacedle caso y cuidadín con los probeteos.

miércoles, 26 de agosto de 2009

Windows Server 2008 y MSDE 2000

He leído en internet, a gente que dice que la MSDE 2000 no funciona bajo Windows Server 2008, porque es demasiado vieja, etc.
Puedo deciros que es completamente falso, ya que en uno de nuestros clientes tenemos funcionando nuestra aplicación de gestión bajo MSDE 2000 con SP4 en un servidor con Windows Server 2008.

jueves, 13 de agosto de 2009

Importar fichero XML a una tabla

Esto sólo funciona para SQL Server 2005 y SQL Server 2008. Se puede conseguir gracias a la opción BULK de OPENROWSET y luego usando la capacidad XQuery que nos proporciona SQL Server para parsear el xml en una tabla.
Al lío que me lío.

En C:\Libros.xml tengo un xml conteniendo:


Lo que intento es volcar los datos de ID y Titulo en una tabla Libros, para ello, nos creamos la tabla:

--Creamos la tabla
CREATE TABLE Libros(
ID INT PRIMARY KEY,
Titulo VARCHAR(100))

Y ahora pasamos los datos (os pongo una imagen con todo el código y el resultado del select sobre la tabla):


miércoles, 5 de agosto de 2009

Pantallazo azul

Bueno con esto quiero responder a un correo de un amigo y la discusión que planteaba en el correo. En esta imagen se puede ver una máquina de CocaCola con un pantallazo azul. El motivo de este post es aclarar que ese pantallazo azul no es consecuencia de un error de memoria, sino un error con un controlador USB. Si os fijáis en la última línea del pantallazo veréis que dice usbhub.sys

Investigando un poco he llegado a un blog en el que explican este error y su posible solución, el link lo tenéis aquí:
http://ayudabsod.blogspot.com/2009/06/kerneldatainpageerror-0x0000007a.html
Pero como no podemos fiarnos de todo lo que leemos, he seguido investigando un poco más.
Varias de las cosas que he aprendido es:
1.- El pantallazo nos da la información para indagar en el error, sólo tenemos que saber diferenciar la paja del grano. Las tres líneas que nos dan la información son, una que dice, KERNEL_DATA_INPAGE_ERROR
luego otra que dice STOP: 0x0000007A (parámetro1, parámetro2, parámetro3, parámetro4)
y por último la última línea que dice usbhub.sys
2.- Con estos datos vamos a la biblioteca de Microsoft, ya que son sus errores (;-)) y con un poco de suerte tendremos la solución
http://msdn.microsoft.com/en-us/library/ms793989.aspx
Si os fijáis en los parámetros entre paréntesis, el segundo parámetro nos dice, según la msdn:
0xC0000185, or STATUS_IO_DEVICE_ERROR, indicates improper termination or defective cabling on SCSI devices or that two devices are trying to use the same IRQ
No he encontrado más información acerca de los demás parámetros ya que no se diferencian bien los caracteres. Tampoco sabemos que sistema operativo usa la dichosa máquina.

lunes, 3 de agosto de 2009

Ejecución Diferida y Ejecución Inmediata (LINQ)

Esta es una de las bases de LINQ. ¿Pero qué significa ejecución diferida?
Significa que al ejecutar una consulta LINQ, la totalidad de los resultados no se cargan en memoria, en su lugar los resultados se van cargando a medida que se evalúa la consulta. Esta es la ventaja principal, porque hace que ahorremos recursos.
Por ejemplo, supongamos que tenemos una consulta que nos devuelve mil elementos, si sólo nos interesa el primer elemento y queremos descartar los demás, esos 999 elementos no se cargarán en memoria.
Otra de las ventajas de la ejecución diferida es que nos permite reutilizar la consulta cuando queramos y las veces que lo necesitemos.

Por otro lado tenemos la ejecución inmediata. ¿Qué significa?
A veces por la naturaleza de nuestro programa necesitaremos que la consulta se ejecute completamente, antes de que se procesen los resultados (cómo ejemplo de ejecución inmediata tenéis el post que escribí el otro día Cargar RSS en un Datagridview, la última línea de código dgvRSS.DataSource = feeds.ToList();).
El método de extensión ToList() es lo que fuerza la ejecución inmediata.

Ejemplo de los dos casos:

sábado, 1 de agosto de 2009

Casting con los operadores "is" y "as" en C#

Estoy leyendo el libro CLR Via C# y quería compartir con vosotros algo que he visto y resulta interesante en cuanto a rendimiento en el código ;-)

El operador "is" comprueba si un objeto es compatible con un tipo dado, y el resultado de la operación es un valor booleano (true o false). El operador "is" nunca provoca una excepción.
Ejemplo:
Object o = new Object();
Boolean prueba = (o is Object); //prueba es true
Boolean prueba2 = (o is Persona); //prueba2 es false

Si la referencia al objeto es null, el operador "is" siempre devuelve el valor false, porque no hay un objeto disponible para verificar su tipo.
El modo más común de usar el operador is:
if (o is Persona)
{
Persona p = (Persona) o;
//...
}

El CLR según nuestra condición IF del ejemplo verificará el tipo de objeto 2 veces, primero comprobará si o es compatible con el tipo Persona. Si lo es, dentro del if, el CLR otra vez comprobará que o referencia a una Persona cuando haga el cast.
El CLR nos proporciona seguridad, pero a costa de rendimiento, ya que el CLR determina el tipo actual del objeto referenciado por la variable o, y luego el CLR recorre la jerarquía de herencia comprobando cada tipo base contra el tipo especificado (Persona).

Aquí es dónde C# viene en nuestro rescate y nos ofrece el operador "as" para simplificarnos la vida y ganar en rendimiento:
Persona p = o as Persona;
if (p!=null)
{
//...
}

En este código el CLR comprueba si o es compatible con el tipo Persona, si lo es, "as" devuelve una referencia no nula al mismo objeto. Por contra si no es compatible, devuelve un valor null. La buena noticia, es que el operador "as" provoca que el CLR sólo tenga que comprobar el tipo de objeto una única vez.
El operador "as" tampoco genera ninguna excepción, si el objeto no puede convertirse, simplemente devuelve un valor null.

Eso es todo, voy a seguir escuchando MOS (Ministry of Sound, no penséis en Sharepoint frikis!!!) Trance Nation que ya es sábado sabadete ...