tag:blogger.com,1999:blog-17983671327775444962024-03-06T04:18:46.109+01:00FRVSoftDesarrollo de software con VB, C#, SQL Server y sucesos graciosos del día a día.Francisco Ruizhttp://www.blogger.com/profile/01311280257518340450noreply@blogger.comBlogger83125tag:blogger.com,1999:blog-1798367132777544496.post-45976260034426089872011-11-27T10:30:00.001+01:002011-11-27T10:37:27.401+01:00Troubleshooting SQL Server [free eBook]Os dejo un link de Red Gate dónde podréis descargar este libro:<br />
<b>Troubleshooting SQL Server A guide for the accidental DBA. Jonathan Kehayias and Ted Krueger.
</b><br />
<br />
<a href="http://www.red-gate.com/our-company/about/book-store/accidental-dba">http://www.red-gate.com/our-company/about/book-store/accidental-dba </a><br />
<br />
Si os gusta, también podéis comprar la edición impresa en Amazon.Francisco Ruizhttp://www.blogger.com/profile/01311280257518340450noreply@blogger.com0tag:blogger.com,1999:blog-1798367132777544496.post-21116525716259931152011-11-03T23:30:00.001+01:002011-11-03T23:30:36.081+01:00Ahora también en tu móvilYa podéis leer los post desde vuestros móviles.
Tengo futuros post en mente que espero compartir con vosotros. Nos leemos en breve.
Salu2.Francisco Ruizhttp://www.blogger.com/profile/01311280257518340450noreply@blogger.com0tag:blogger.com,1999:blog-1798367132777544496.post-76410763148115956662010-02-08T15:22:00.003+01:002010-02-08T15:53:12.423+01:00Desactivar un Trigger temporalmentePara desactivar un trigger temporalmente y luego volver a activarlo, tenemos que hacer lo siguiente:<br /><br />ALTER TABLE miTabla DISABLE TRIGGER ALL<br />--aquí ejecutaremos lo que necesitemos y luego lo volvemos a activar<br />ALTER TABLE miTabla ENABLE TRIGGER ALL<br /><br />Realmente desactiva todos los triggers de esa tabla, si queremos uno en concreto en lugar de ALL especificamos el nombre del trigger.Francisco Ruizhttp://www.blogger.com/profile/01311280257518340450noreply@blogger.com2tag:blogger.com,1999:blog-1798367132777544496.post-9986593562161165322009-11-21T18:21:00.005+01:002009-11-21T18:32:21.195+01:00Tips & Tricks Error SQLFile.sqlAl intentar ejecutar una consulta con el management studio nos da un error:<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvKF-zpMmZvomcviTpxGJoyi8DqlH2835xGJx-NTr6rXx2GqpzVtH94a0p5fOVeqvX73vvePFn-lgXe2SYzl_0zK07SyikHAtRG2yotqxDZSh9ZNhGSLqsxyebKbDHpydXiHApi2vv8Pjm/s1600/ErrorSQLFile.jpg"><img style="cursor:pointer; cursor:hand;width: 320px; height: 122px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvKF-zpMmZvomcviTpxGJoyi8DqlH2835xGJx-NTr6rXx2GqpzVtH94a0p5fOVeqvX73vvePFn-lgXe2SYzl_0zK07SyikHAtRG2yotqxDZSh9ZNhGSLqsxyebKbDHpydXiHApi2vv8Pjm/s320/ErrorSQLFile.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5406609471136362786" /></a><br /><br />Para solucionarlo, podemos crearnos en ese mismo directorio un fichero que se llame SQLFile.sql sin contenido, y asunto solucionado. Otra manera es copiar el mismo fichero de otro equipo en el que tengamos SQL Server 2005 o 2008 instalado.Francisco Ruizhttp://www.blogger.com/profile/01311280257518340450noreply@blogger.com1tag:blogger.com,1999:blog-1798367132777544496.post-56897204806372002432009-11-21T16:34:00.002+01:002009-11-21T18:14:48.880+01:00Recetario T-SQLA groso modo vamos a ver el flujo que sigue una query:<br /><br />Análisis -- Algebrizer (no se como traducirlo xD) -- Optimización -- Ejecución<br /><br />Ahora veamos una pregunta que me llegaba vía email:<br />Supongamos que tenemos una tabla Prueba con dos columnas (IDPrueba y Descripcion), ejecutamos un script que elimina la columna Descripcion de la tabla y más adelante en el script encontramos lo siguiente:<br />IF 1=0<br />BEGIN<br /> UPDATE Prueba SET Descripcion='Hola'<br /> WHERE IDPrueba = 1<br />END<br />GO<br /><br />Como 1 no es igual a cero no debe ejecutarse el contenido, pero al ejecutar el script vemos que nos devuelve un error advirtiéndonos de que el campo Descripcion es erróneo.<br />Mens. 207, Nivel 16, Estado 1, Línea 3<br />El nombre de columna 'Descripcion' no es válido.<br /><br />Una solución para que no nos de este error es usar SQL dinámico y nuestro código quedaría tal que así:<br />IF 1=0<br />BEGIN<br /> EXECUTE('UPDATE Prueba SET Descripcion=''Hola''<br /> WHERE IDPrueba = 1')<br />END<br />GOFrancisco Ruizhttp://www.blogger.com/profile/01311280257518340450noreply@blogger.com0tag:blogger.com,1999:blog-1798367132777544496.post-20085706901457280352009-11-11T23:36:00.003+01:002009-11-11T23:47:50.190+01:00Restore Database con SMO C#Bueno para ir completando la serie de posts con SMO hoy toca el esperado restore. Antes de nada pediros disculpas por no haberlo publicado antes, pero ando liado por casa y no he tenido tiempo para actualizar el blog.<br /><br />Aquí tenéis el código:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDAUb1rZfCn4D3HwhcYLkzLAVsXf1Io4U0v3RY1Hlx1SE_lLQMWKiby-pkId3a1rLIHeq2itzN21csdWk35DIQmQ2WJJk8WMOAOldUMVrzSygHHMgj1aCtrzWQcxI30q9mR9b952_6ZDX7/s1600-h/RestoreDB.jpg"><img style="cursor:pointer; cursor:hand;width: 320px; height: 182px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDAUb1rZfCn4D3HwhcYLkzLAVsXf1Io4U0v3RY1Hlx1SE_lLQMWKiby-pkId3a1rLIHeq2itzN21csdWk35DIQmQ2WJJk8WMOAOldUMVrzSygHHMgj1aCtrzWQcxI30q9mR9b952_6ZDX7/s320/RestoreDB.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5402979978115727282" /></a><br /><br />A tener en cuenta: en la cadena de conexión sólo especificad el servidor (Data Source) y el tipo de conexión (si es trusted o con credenciales de sql).Francisco Ruizhttp://www.blogger.com/profile/01311280257518340450noreply@blogger.com0tag:blogger.com,1999:blog-1798367132777544496.post-25587704441596030632009-09-30T23:28:00.004+02:002009-10-01T00:34:47.636+02:00Compatibilidad hacia atrás en OfficeMediante la aplicación TlbImp.exe (http://msdn.microsoft.com/es-es/library/tt0cf3sx(VS.80).aspx) podremos convertir un componente COM de Office (por ser el tema del post) en una assembly .NET Interop lista para usar y distribuir con nuestra aplicación. La manera de hacerlo es simple y directa:<br />1.- Lo primero es localizar dónde está situada la aplicación TlbImp.exe: se encuentra en C:\Archivos de programa\Microsoft Visual Studio 8\SDK\v2.0\Bin\ <br />(o bien en la unidad dónde tengáis instalado Visual Studio)<br />2.- Copiamos el fichero (.olb ver último link del post para saber de lo que hablo) que queremos convertir en nuestra dll .NET, en un directorio por ejemplo C:\Interop<br />3.- Abrimos la línea de comando y vamos hasta la ruta dónde tenemos la aplicación TlbImp y escribimos <br />C:\Archivos de programa\Microsoft Visual Studio 8\SDK\v2.0\Bin\<strong>TlbImp.exe C:\Interop\MSWord9.olb /out=C:\Interop\FRVSoft.Office.Word.dll</strong><br />Y ya tendremos creada nuestra dll.<br /><br />Ahora sólo tenemos que añadirla en las referencias de nuestro proyecto. Con esto conseguimos tener una compatibilidad desde Word 2000 hasta Word 2007. Claro está que si queremos usar alguna característica nueva de Office 2007 no dispondremos de ella en nuestra dll ya que partimos de la versión 2000.<br /><br />Este enlace os puede ser de utilidad algún día en el futuro, cuando tengáis que pelear con Office desde vuestras aplicaciones, en distintos clientes con diferentes versiones de Office:<br />http://support.microsoft.com/kb/239930/esFrancisco Ruizhttp://www.blogger.com/profile/01311280257518340450noreply@blogger.com0tag:blogger.com,1999:blog-1798367132777544496.post-37249408470776169372009-09-11T22:35:00.003+02:002009-09-11T22:39:05.309+02:00Soluciones a problemas relacionados con T-SQLOtro link interesante con multitud de soluciones e ideas para abordar los problemas del día a día.<br /><br />http://code.msdn.microsoft.com/SQLExamplesFrancisco Ruizhttp://www.blogger.com/profile/01311280257518340450noreply@blogger.com0tag:blogger.com,1999:blog-1798367132777544496.post-56292502354886096502009-09-11T22:23:00.003+02:002009-09-11T22:28:21.428+02:00Otro eBook por la patilla sobre SQL Server cortesía de Quest SoftwareAquí tenéis los link para descargaros SQL Server: A Practical Guide to Backup, Recovery & Troubleshooting con copyright de Quest Software<br /><br />Parte 1:<br />http://www.quest.com/quest_site_assets/whitepapers/sql_server_ebook_a_practical_guide_to_backup,_recovery,_and_troubleshooting_(part_1).pdf<br /><br />Parte 2:<br />http://www.quest.com/quest_site_assets/whitepapers/sql_server_ebook_a_practical_guide_to_backup,_recovery,_and_troubleshooting_(part_2).pdfFrancisco Ruizhttp://www.blogger.com/profile/01311280257518340450noreply@blogger.com0tag:blogger.com,1999:blog-1798367132777544496.post-85068027915376404662009-09-10T19:27:00.002+02:002009-09-10T19:41:54.375+02:00AdSense esa gran chapuzaHoy recibo un correo en el que Google AdSense me dice:<br /><br />Estimado/a :<br /><br />Al revisar nuestros datos, hemos detectado que su cuenta de AdSense ha<br />supuesto un peligro importante para nuestros anunciantes de AdWords. Dada<br />la posibilidad de que el mantenimiento de su cuenta en nuestra red de<br />editores perjudique económicamente a los anunciantes en el futuro, hemos<br />decidido inhabilitarla.<br /><br />Consideramos que esta medida es necesaria para proteger los intereses de<br />los anunciantes y los de los demás editores de AdSense. Somos conscientes<br />de que esta situación puede causarle molestias, por lo que agradecemos de<br />antemano su comprensión y cooperación.<br /><br />Si tiene alguna pregunta sobre su cuenta o las acciones que hemos<br />realizado, no conteste a este mensaje. Encontrará más información en la<br />página siguiente:<br />https://www.google.com/adsense/support/bin/answer.py?answer=57153.<br /><br />Atentamente,<br /><br />El equipo AdSense de Google.<br /><br />Macho ni que fuera el Dioni o Roldán. En tres años de AdSense no tengo ni para pipas xDDDD.<br />Gracias a la gente que haya pinchado en los anuncios.<br />Seguiré publicando (porque el objetivo es compartir lo que aprendo y plasmarlo por si a otra persona le sirve), y seguramente el blog ganará en espacio para otras cosas y no en anuncios chorras de lectura de manos y sus muertos los cuales aleatoriamente publicaba google.<br /><br />P.D. La peonza, la trompeta y el par de calcetines, puedes venir a recogerlos cuando quieras y metértelos por el culo.Francisco Ruizhttp://www.blogger.com/profile/01311280257518340450noreply@blogger.com2tag:blogger.com,1999:blog-1798367132777544496.post-85994451363499550632009-09-08T21:20:00.003+02:002009-09-08T21:37:32.847+02:00C# parámetros por referencia (out y ref)Para el CLR, out y ref son idénticos (generan los mismos metadatos y el mismo código IL), pero el compilador de C# los trata de manera distinta. <br /><br />Esa distinción se basa en que, si usamos out en un parámetro de un método, no estamos obligados a inicializar el objeto antes de la llamada al método. En cambio si usamos ref, antes de la llamada al método debemos inicializar el valor del parámetro.<br /><br />Otro punto a tener en cuenta es que no podemos sobrecargar un método en el que la sobrecarga difiera sólo en out y ref, ejemplo:<br />static void Suma(out Int32 n) { }<br />static void Suma(ref Int32 x) { }<br />Este caso provocaría un error de tipo 'Suma' cannot define overloaded methods that differ only on ref and out.Francisco Ruizhttp://www.blogger.com/profile/01311280257518340450noreply@blogger.com1tag:blogger.com,1999:blog-1798367132777544496.post-3211398333359780652009-09-06T10:02:00.007+02:002009-09-06T10:55:18.590+02:00Mejorando el rendimiento en nuestros constructores de claseCuanto más leo CLR Via C# más me gusta el libro, una de las cosas que me ha llamado la atención es la manera de declarar los diferentes constructores que pueda tener una clase. Por ejemplo, supongamos que tenemos una clase "X", con "n" campos a inicializar, y en esa clase definimos "X" constructores diferentes, ejemplo:<br /><code><br />    internal sealed class MenosRendimiento<br /><br />    {<br /><br />        private int _a = 1;<br /><br />        private string _cadena = "Hola";<br /><br />        private double _n = 5.125;<br /><br />        private byte _b;<br /><br /><br /><br />        public MenosRendimiento() { }<br /><br />        public MenosRendimiento(int a) { }<br /><br />        public MenosRendimiento(string cadena) { }<br /><br />        public MenosRendimiento(int a, string cadena) { }<br /><br />    }<br /><br /><br /></code><br />De esta forma estamos incurriendo en un gasto de recursos innecesarios, ya que estaremos inicializando los tres campos de la clase en cada constructor (en este caso 12 veces). _b nos garantiza que se inicializa a cero aunque no lo especifiquemos.<br /><br />Lo correcto sería declarar los campos de clase sin inicializar, crear un constructor simple que inicialice los campos, y los demás constructores llamarán al constructor de inicialización común, para verlo más claro os pongo como quedaría el código:<br /><code><br />    internal sealed class MasRendimiento<br /><br />    {<br /><br />        private int _a;<br /><br />        private string _cadena;<br /><br />        private double _n;<br /><br />        private byte _b;<br /><br /><br /><br />        //Este constructor inicializa los campos<br /><br />        //a su valor por defecto.<br /><br />        //todos los demás constructores llamarán<br /><br />        //explícitamente a este constructor<br /><br />        public MasRendimiento() <br /><br />        {<br /><br />            _a = 1;<br /><br />            _cadena = "Hola";<br /><br />            _n = 5.125;<br /><br />            _b = 0xff;<br /><br />        }<br /><br />        //Campos a valor por defecto y luego<br /><br />        //cambia a<br /><br />        public MasRendimiento(int a) : this()<br /><br />        {<br /><br />            _a = a;<br /><br />        }<br /><br />        //Campos a valor por defecto y luego<br /><br />        //cambia cadena<br /><br />        public MasRendimiento(string cadena) : this()<br /><br />        {<br /><br />            _cadena = cadena;<br /><br />        }<br /><br />        //Campos a valor por defecto y luego<br /><br />        //cambia a y cadena<br /><br />        public MasRendimiento(int a, string cadena) <br /><br />            : this()<br /><br />        {<br /><br />            _a = a;<br /><br />            _cadena = cadena;<br /><br />        }<br /><br />    }<br /><br /><br /></code><br />Esta es la "magia" que nos aporta C#, que mediante "this" podamos llamar de un constructor a otro.Francisco Ruizhttp://www.blogger.com/profile/01311280257518340450noreply@blogger.com0tag:blogger.com,1999:blog-1798367132777544496.post-81029687655771733092009-09-05T21:37:00.003+02:002009-09-05T21:42:09.621+02:00Backup con SMO en C#Así ya tenemos a los hermanitos (un ejemplo en el blog en VB y otro en C#):<br /><br /><code>try<br />{<br />    using (SqlConnection cn = new SqlConnection(llConexion.Text))<br />    {<br />        cn.Open();<br />        serverConnection = new ServerConnection(cn);<br />        Backup bck = new Backup();<br />        bck.Database = serverConnection.DatabaseName;<br />        bck.Devices.Add(new BackupDeviceItem(rutaBackup + @"\" + serverConnection.DatabaseName + ".BAK", DeviceType.File));<br />        bck.Action = BackupActionType.Database;<br />        bck.SqlBackup(new Server(serverConnection));<br />        MessageBox.Show("Proceso completado");<br />    }           <br />}<br />catch (SmoException ex)<br />{<br />    MessageBox.Show(ex.Message);<br />}<br /><br /></code>Francisco Ruizhttp://www.blogger.com/profile/01311280257518340450noreply@blogger.com4tag:blogger.com,1999:blog-1798367132777544496.post-50277211621797289312009-09-05T20:53:00.006+02:002009-09-05T21:29:24.507+02:00Kill a todas las conexiones de una BD con SMOAhí va un post sencillito con SMO:<br /><br /><code><code>using (SqlConnection cn = new SqlConnection(llConexion.Text))<br />{<br />    cn.Open();<br />    serverConnection = new ServerConnection(cn);<br />    Server server = new Server(serverConnection);<br />    server.KillAllProcesses(serverConnection.DatabaseName);<br />    MessageBox.Show("Proceso terminado");<br />}<br /><br /></code></code><br /><code></code>Dónde, llConexion.Text será la cadena de conexión con vuestra BD. ServerConnection es una variable global inicializada a null (en el contexto de mi aplicación, para este ejemplo podría haberla declarado después de abrir la conexión de esta manera,<br />ServerConnection serverConnection = new ServerConnection(cn);)Francisco Ruizhttp://www.blogger.com/profile/01311280257518340450noreply@blogger.com0tag:blogger.com,1999:blog-1798367132777544496.post-5638065835418110182009-09-04T21:21:00.003+02:002009-09-04T21:31:18.220+02:00Teclas rápidas IE 8Me encantan los atajos de teclado y no tener que estar dale que te pego al ratón, así que aquí os dejo las teclas rápidas de Internet Explorer 8:<br /><br /><a href="http://www.microsoft.com/spain/windows/products/winfamily/ie/quickref.mspx">http://www.microsoft.com/spain/windows/products/winfamily/ie/quickref.mspx</a><br /><br />Que gozada, CTRL+TAB, CTRL+MAY+TAB, ALT+Inicio, CTRL+T, con estas me conformo y luego las pijadillas CTRL+QFrancisco Ruizhttp://www.blogger.com/profile/01311280257518340450noreply@blogger.com0tag:blogger.com,1999:blog-1798367132777544496.post-47739128587118604772009-09-02T21:06:00.005+02:002009-09-02T21:20:06.998+02:00[OT] Teléfono WindowsMás bien conocidos como Windows Phone, es la novedad que llegará el próximo 6 de Octubre. En realidad son los nuevos teléfonos equipados con Windows Mobile 6.5 y que serán distribuidos por las principales operadoras de telefonía y los principales fabricantes de teléfonos, aquí os dejo una relación por continentes:<br /><br />- En Norte América: operadoras móviles AT&T, Bell Mobility, Sprint, TELUS y Verizon Wireless, fabricantes HP, HTC Corp., LG Electronics, Samsung y Toshiba Corp.<br />- En Europa: operadoras móviles Orange, Deutsche Telekom AG y Vodafone Group Plc, y fabricantes Acer, HTC, LG Electronics, Samsung, Sony Ericsson y Toshiba<br />- Latinoamérica: operadoras móviles TIM Brazil, y fabricantes HTC, LG Electronics y Samsung<br />- En Asia: operadoras móviles NTT DOCOMO Inc., SOFTBANK Mobile Corp., SK Telecom, Telstra y WILLCOM Inc., y fabricantes Acer Inc., HTC, LG Electronics, Samsung, Sony Ericsson y Toshiba<br /><br />Al contrario de lo que he leído en otras páginas microsoft asegura que habrá teléfonos para todos los gustos, con teclado qwerty o sin teclado, con pantalla táctil y sin pantalla táctil, con acelerómetro, GPS y cámaras de alta resolución.<br /><br />Fuente: <a href="http://windowsteamblog.com/blogs/windowsphone/archive/2009/09/01/windows-phones-are-coming-on-october-6th.aspx">http://windowsteamblog.com/blogs/windowsphone/archive/2009/09/01/windows-phones-are-coming-on-october-6th.aspx</a>Francisco Ruizhttp://www.blogger.com/profile/01311280257518340450noreply@blogger.com4tag:blogger.com,1999:blog-1798367132777544496.post-15579248433823989452009-08-31T21:53:00.004+02:002009-08-31T22:04:50.656+02:00SQL Server 2008 R2 y mi BD de ProducciónAtenció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.<br /><br />Esto no lo digo yo, lo dice mi amigo Paul Randal, así que hacedle caso y cuidadín con los probeteos.Francisco Ruizhttp://www.blogger.com/profile/01311280257518340450noreply@blogger.com0tag:blogger.com,1999:blog-1798367132777544496.post-75228596507167568562009-08-26T09:39:00.003+02:002009-08-26T09:45:33.193+02:00Windows Server 2008 y MSDE 2000He leído en internet, a gente que dice que la MSDE 2000 no funciona bajo Windows Server 2008, porque es demasiado vieja, etc.<br />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.Francisco Ruizhttp://www.blogger.com/profile/01311280257518340450noreply@blogger.com2tag:blogger.com,1999:blog-1798367132777544496.post-44342141353387433882009-08-13T13:37:00.006+02:002009-08-13T14:00:23.076+02:00Importar fichero XML a una tablaEsto 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.<br /><div>Al lío que me lío.</div><br /><div>En C:\Libros.xml tengo un xml conteniendo:</div><br /><div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjle6m8qzZVGfQv9OkcMJW-lm4U1risMn5Ap0udU4DH3KCxqJdHNx8kmjsi5UFlFdLwcp9doPuSnkMxf-rChChl1kpnGxpONbI3KbSUYv3pskU_4T3Yn3Q_w9CvdMHkjHzxJEUyR2MwqK2Y/s1600-h/XMLaTabla2.jpg"><img style="WIDTH: 320px; HEIGHT: 265px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5369415124592220402" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjle6m8qzZVGfQv9OkcMJW-lm4U1risMn5Ap0udU4DH3KCxqJdHNx8kmjsi5UFlFdLwcp9doPuSnkMxf-rChChl1kpnGxpONbI3KbSUYv3pskU_4T3Yn3Q_w9CvdMHkjHzxJEUyR2MwqK2Y/s320/XMLaTabla2.jpg" /></a><br />Lo que intento es volcar los datos de ID y Titulo en una tabla Libros, para ello, nos creamos la tabla:</div><br /><p>--Creamos la tabla<br />CREATE TABLE Libros(<br />ID INT PRIMARY KEY,<br />Titulo VARCHAR(100))</p><p>Y ahora pasamos los datos (os pongo una imagen con todo el código y el resultado del select sobre la tabla):</p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-gVyw0lOEcv9wn4HxubWEjYnxhhRC44WlL7tKx7V3lRdCetjIjSXge8YG0nd27WENa1oNR35gSMfjViCWNCu__odEiOl8seuQ-tLoJEs-b6OfaQF2httoVvUnxPwR42Fs70yI9aHJNtPC/s1600-h/XMLaTabla.jpg"><img style="WIDTH: 320px; HEIGHT: 246px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5369415893733171074" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-gVyw0lOEcv9wn4HxubWEjYnxhhRC44WlL7tKx7V3lRdCetjIjSXge8YG0nd27WENa1oNR35gSMfjViCWNCu__odEiOl8seuQ-tLoJEs-b6OfaQF2httoVvUnxPwR42Fs70yI9aHJNtPC/s320/XMLaTabla.jpg" /></a><br /><div></div>Francisco Ruizhttp://www.blogger.com/profile/01311280257518340450noreply@blogger.com0tag:blogger.com,1999:blog-1798367132777544496.post-24832869280734429702009-08-05T19:02:00.004+02:002009-08-05T21:16:17.032+02:00Pantallazo azul<div>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 <strong>usbhub.sys</strong></div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3WivCwAPRcKPSchCKquRuWUIEeDzZZyTqY7d_97ATngVu6NLKBQT1VrnmbOia3ubU0rgqMI1nbZ1izhLnWVQ3umb4PM3B-g1xZ_s9yCEW3MSz-2gmsr9FYcHQt4U7aZQ4MVn1ZTMO_QuA/s1600-h/ErrorCocaCola.JPG"><img style="WIDTH: 320px; HEIGHT: 257px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5366527390491214258" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3WivCwAPRcKPSchCKquRuWUIEeDzZZyTqY7d_97ATngVu6NLKBQT1VrnmbOia3ubU0rgqMI1nbZ1izhLnWVQ3umb4PM3B-g1xZ_s9yCEW3MSz-2gmsr9FYcHQt4U7aZQ4MVn1ZTMO_QuA/s320/ErrorCocaCola.JPG" /></a><br /><div> </div><div>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í:<br /><a href="http://ayudabsod.blogspot.com/2009/06/kerneldatainpageerror-0x0000007a.html">http://ayudabsod.blogspot.com/2009/06/kerneldatainpageerror-0x0000007a.html</a></div><div>Pero como no podemos fiarnos de todo lo que leemos, he seguido investigando un poco más.</div><div> </div><div>Varias de las cosas que he aprendido es:<br />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<br />luego otra que dice STOP: 0x0000007A (parámetro1, parámetro2, parámetro3, parámetro4)<br />y por último la última línea que dice usbhub.sys<br /></div><div>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<br /><a href="http://msdn.microsoft.com/en-us/library/ms793989.aspx">http://msdn.microsoft.com/en-us/library/ms793989.aspx</a><br />Si os fijáis en los parámetros entre paréntesis, el segundo parámetro nos dice, según la msdn:<br />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</div><div> </div><div>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.</div><div> </div>Francisco Ruizhttp://www.blogger.com/profile/01311280257518340450noreply@blogger.com1tag:blogger.com,1999:blog-1798367132777544496.post-21227163230380297012009-08-03T13:24:00.005+02:002009-08-03T13:57:54.552+02:00Ejecución Diferida y Ejecución Inmediata (LINQ)Esta es una de las bases de LINQ. ¿Pero qué significa ejecución diferida?<br />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.<br />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.<br />Otra de las ventajas de la ejecución diferida es que nos permite reutilizar la consulta cuando queramos y las veces que lo necesitemos.<br /><br />Por otro lado tenemos la ejecución inmediata. ¿Qué significa?<br />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();).<br />El método de extensión ToList() es lo que fuerza la ejecución inmediata.<br /><br />Ejemplo de los dos casos:<br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQHaCVgT0Z5wPpD-pbxpQLpQZ8wx53qJsXVt1EH-bdxg74oGUcuGGN3TndP4ZI-xpTwr9HG4QD5a0BamGmv7eQ2w-9c-GFaPuzR8JAS4cZ1JBT22xQz27ofY4iKkwjioaxVk6XNH2pAHSC/s1600-h/EjecucionDiferida.JPG"><img style="WIDTH: 320px; HEIGHT: 213px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5365705198857554658" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQHaCVgT0Z5wPpD-pbxpQLpQZ8wx53qJsXVt1EH-bdxg74oGUcuGGN3TndP4ZI-xpTwr9HG4QD5a0BamGmv7eQ2w-9c-GFaPuzR8JAS4cZ1JBT22xQz27ofY4iKkwjioaxVk6XNH2pAHSC/s320/EjecucionDiferida.JPG" /></a>Francisco Ruizhttp://www.blogger.com/profile/01311280257518340450noreply@blogger.com0tag:blogger.com,1999:blog-1798367132777544496.post-42268687001337358822009-08-01T22:59:00.005+02:002009-08-01T23:36:45.625+02:00Casting 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 ;-)<br /><br />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.<br />Ejemplo:<br /><strong>Object o = new Object();</strong><br /><strong>Boolean prueba = (o is Object); //prueba es true</strong><br /><strong>Boolean prueba2 = (o is Persona); //prueba2 es false</strong><br /><br />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.<br />El modo más común de usar el operador is:<br /><strong>if (o is Persona)</strong><br /><strong>{</strong><br /><strong> Persona p = (Persona) o;</strong><br /><strong> //...</strong><br /><strong>}</strong><br /><br />El CLR según nuestra condición IF del ejemplo verificará el tipo de objeto 2 veces, primero comprobará si <strong>o</strong> es compatible con el tipo <strong>Persona</strong>. Si lo es, dentro del if, el CLR otra vez comprobará que <strong>o</strong> referencia a una <strong>Persona</strong> cuando haga el cast.<br />El CLR nos proporciona seguridad, pero a costa de rendimiento, ya que el CLR determina el tipo actual del objeto referenciado por la variable <strong>o</strong>, y luego el CLR recorre la jerarquía de herencia comprobando cada tipo base contra el tipo especificado (Persona).<br /><br />Aquí es dónde C# viene en nuestro rescate y nos ofrece el operador "as" para simplificarnos la vida y ganar en rendimiento:<br /><strong>Persona p = o as Persona;</strong><br /><strong>if (p!=null)</strong><br /><strong>{</strong><br /><strong> //...</strong><br /><strong>}</strong><br /><br />En este código el CLR comprueba si <strong>o</strong> es compatible con el tipo <strong>Persona</strong>, 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.<br />El operador "as" tampoco genera ninguna excepción, si el objeto no puede convertirse, simplemente devuelve un valor null. <br /><br />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 ...Francisco Ruizhttp://www.blogger.com/profile/01311280257518340450noreply@blogger.com2tag:blogger.com,1999:blog-1798367132777544496.post-70919343506149806212009-07-31T21:46:00.005+02:002009-08-03T09:52:24.117+02:00Recetario T-SQLEjecución de un lote X veces. ¿Cómo lo conseguimos?<br />Muy sencillo, a partir de SQL Server 2005, se introdujo la posibilidad de ejecutar un batch x veces mediante el comando GO X (siendo X el número de veces que queremos que se ejecute).<br />Ejemplo:<br /><br />SELECT GETDATE() AS FechaActual<br />GO 10Francisco Ruizhttp://www.blogger.com/profile/01311280257518340450noreply@blogger.com0tag:blogger.com,1999:blog-1798367132777544496.post-13741416425756705742009-07-31T19:45:00.003+02:002009-07-31T20:11:11.811+02:00Cargar RSS en un DataGridView con LINQ to XMLVamos a cargar las rss de mi blog en un datagridview, para ello creamos una clase Feed tal como esta: <div><div></div><br /><div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgw5OAotxG_M-SWTL_k9VTv9ckg31PsVz0EetVXbOwaqPvK-vX9X_5om39Cp4TEnVTwLSfb54Lp5vd20teH-zT87y7n4CKhOcA3DiRST7Syf6RxAOzDWtcHadO2UZ_cI4zKh6qb44mc2cME/s1600-h/Feeds1.jpg"><img style="WIDTH: 320px; HEIGHT: 288px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5364687243076284642" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgw5OAotxG_M-SWTL_k9VTv9ckg31PsVz0EetVXbOwaqPvK-vX9X_5om39Cp4TEnVTwLSfb54Lp5vd20teH-zT87y7n4CKhOcA3DiRST7Syf6RxAOzDWtcHadO2UZ_cI4zKh6qb44mc2cME/s320/Feeds1.jpg" /></a></div><br /><div></div><div>Ahora el resultado de los feeds en una consulta sencillita en LINQ to XML la pasamos a nuestro datagridview:</div><br /><div></div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjarw31HjoWGe92zmGwGLseggaFseUwrXXH7dZRzzcOcDM2KYhd2qQjoOSWBU36n7sgDSxDnO-l1YCRiaJlPnR02HzFDz0LAHvu4B0RgD2U1W6i_Jkofcu2xMt_w2xhWMga29iI88yCP_yR/s1600-h/Feeds2.jpg"><img style="WIDTH: 320px; HEIGHT: 140px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5364687711505702466" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjarw31HjoWGe92zmGwGLseggaFseUwrXXH7dZRzzcOcDM2KYhd2qQjoOSWBU36n7sgDSxDnO-l1YCRiaJlPnR02HzFDz0LAHvu4B0RgD2U1W6i_Jkofcu2xMt_w2xhWMga29iI88yCP_yR/s320/Feeds2.jpg" /></a><br /><br /><div></div><br /><div>Y el resultado final lo vemos aquí: </div><div> </div><div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSZzQfd98_IDFU8g1fHdLKPqbu6Zz0lxbXRyQUrisx4agqaABPUvDXEbWSnYHDnzmjoGpccOswc1LhVimW9bmczyiOPBX9DnvefZfmI0i45WQ2b7OYUQCmKt-VPOXLo8jASgzMwKWilLtw/s1600-h/Feeds3.jpg"><img style="WIDTH: 320px; HEIGHT: 226px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5364688277257912066" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSZzQfd98_IDFU8g1fHdLKPqbu6Zz0lxbXRyQUrisx4agqaABPUvDXEbWSnYHDnzmjoGpccOswc1LhVimW9bmczyiOPBX9DnvefZfmI0i45WQ2b7OYUQCmKt-VPOXLo8jASgzMwKWilLtw/s320/Feeds3.jpg" /></a></div></div>Francisco Ruizhttp://www.blogger.com/profile/01311280257518340450noreply@blogger.com0tag:blogger.com,1999:blog-1798367132777544496.post-15333970087706749072009-07-14T16:57:00.005+02:002009-07-14T17:17:52.185+02:00El juego SIMON<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN7wb-Zy0N2_lL7MjkWQtO0T9gMENHyeT8D0OKZc00CyNHrNH84D3F4ZvczsQunHxJi975g4O1p-fGozW2kyA0xJ3jf8f-ynsS430cOos7WwftI0C1viVyiDiX5StUJNLzfus259OZTB84/s1600-h/250px-Simon_game.jpg"><img style="WIDTH: 250px; HEIGHT: 188px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5358330962031398690" border="0" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN7wb-Zy0N2_lL7MjkWQtO0T9gMENHyeT8D0OKZc00CyNHrNH84D3F4ZvczsQunHxJi975g4O1p-fGozW2kyA0xJ3jf8f-ynsS430cOos7WwftI0C1viVyiDiX5StUJNLzfus259OZTB84/s320/250px-Simon_game.jpg" /></a><br /><div>¿Quién no ha jugado con este juego? Bueno seguro que la gente más joven no sepa ni lo que es, pero era un juego basado en la memoria visual y sonora. Personalmente adictivo (como para otros el cubo de Rubick), me lo regalaron de pequeño y siempre he guardado un grato recuerdo del juego.</div><div> </div><div>El juego consiste en visualizar una secuencia de colores (aleatorios) y luego repetirlos. Cada vez que acertemos la secuencia, empezará otra más difícil y así sucesivamente hasta que fallemos.</div><div></div><div>El motivo del post, es que he encontrado en CodePlex este juego hecho en WPF, Silverlight (2 y 3) y Surface. Te lo puedes descargar desde aquí:</div><div><a href="http://simon.codeplex.com/">http://simon.codeplex.com/</a> (sección downloads)</div><div> </div><div>Lo mejor de todo es que viene con sus fuentes y así puedes disfrutar doblemente, una con el juego y otra con el código.<br /></div><div>El autor del juego es David J Kelley (<a href="http://hackingsilverlight.blogspot.com/">http://hackingsilverlight.blogspot.com/</a> o bien <a href="http://www.hackingsilverlight.net/">http://www.hackingsilverlight.net/</a> (para poder acceder a esta página necesitas tener instalado Silverlight 3).<br /></div><div></div><div></div>Francisco Ruizhttp://www.blogger.com/profile/01311280257518340450noreply@blogger.com0