miércoles, 30 de septiembre de 2009

Compatibilidad hacia atrás en Office

Mediante 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:
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\
(o bien en la unidad dónde tengáis instalado Visual Studio)
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
3.- Abrimos la línea de comando y vamos hasta la ruta dónde tenemos la aplicación TlbImp y escribimos
C:\Archivos de programa\Microsoft Visual Studio 8\SDK\v2.0\Bin\TlbImp.exe C:\Interop\MSWord9.olb /out=C:\Interop\FRVSoft.Office.Word.dll
Y ya tendremos creada nuestra dll.

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.

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:
http://support.microsoft.com/kb/239930/es

viernes, 11 de septiembre de 2009

Soluciones a problemas relacionados con T-SQL

Otro link interesante con multitud de soluciones e ideas para abordar los problemas del día a día.

http://code.msdn.microsoft.com/SQLExamples

Otro eBook por la patilla sobre SQL Server cortesía de Quest Software

Aquí tenéis los link para descargaros SQL Server: A Practical Guide to Backup, Recovery & Troubleshooting con copyright de Quest Software

Parte 1:
http://www.quest.com/quest_site_assets/whitepapers/sql_server_ebook_a_practical_guide_to_backup,_recovery,_and_troubleshooting_(part_1).pdf

Parte 2:
http://www.quest.com/quest_site_assets/whitepapers/sql_server_ebook_a_practical_guide_to_backup,_recovery,_and_troubleshooting_(part_2).pdf

jueves, 10 de septiembre de 2009

AdSense esa gran chapuza

Hoy recibo un correo en el que Google AdSense me dice:

Estimado/a :

Al revisar nuestros datos, hemos detectado que su cuenta de AdSense ha
supuesto un peligro importante para nuestros anunciantes de AdWords. Dada
la posibilidad de que el mantenimiento de su cuenta en nuestra red de
editores perjudique económicamente a los anunciantes en el futuro, hemos
decidido inhabilitarla.

Consideramos que esta medida es necesaria para proteger los intereses de
los anunciantes y los de los demás editores de AdSense. Somos conscientes
de que esta situación puede causarle molestias, por lo que agradecemos de
antemano su comprensión y cooperación.

Si tiene alguna pregunta sobre su cuenta o las acciones que hemos
realizado, no conteste a este mensaje. Encontrará más información en la
página siguiente:
https://www.google.com/adsense/support/bin/answer.py?answer=57153.

Atentamente,

El equipo AdSense de Google.

Macho ni que fuera el Dioni o Roldán. En tres años de AdSense no tengo ni para pipas xDDDD.
Gracias a la gente que haya pinchado en los anuncios.
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.

P.D. La peonza, la trompeta y el par de calcetines, puedes venir a recogerlos cuando quieras y metértelos por el culo.

martes, 8 de septiembre de 2009

C# 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.

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.

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:
static void Suma(out Int32 n) { }
static void Suma(ref Int32 x) { }
Este caso provocaría un error de tipo 'Suma' cannot define overloaded methods that differ only on ref and out.

domingo, 6 de septiembre de 2009

Mejorando el rendimiento en nuestros constructores de clase

Cuanto 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:

    internal sealed class MenosRendimiento

    {

        private int _a = 1;

        private string _cadena = "Hola";

        private double _n = 5.125;

        private byte _b;



        public MenosRendimiento() { }

        public MenosRendimiento(int a) { }

        public MenosRendimiento(string cadena) { }

        public MenosRendimiento(int a, string cadena) { }

    }



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.

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:

    internal sealed class MasRendimiento

    {

        private int _a;

        private string _cadena;

        private double _n;

        private byte _b;



        //Este constructor inicializa los campos

        //a su valor por defecto.

        //todos los demás constructores llamarán

        //explícitamente a este constructor

        public MasRendimiento()

        {

            _a = 1;

            _cadena = "Hola";

            _n = 5.125;

            _b = 0xff;

        }

        //Campos a valor por defecto y luego

        //cambia a

        public MasRendimiento(int a) : this()

        {

            _a = a;

        }

        //Campos a valor por defecto y luego

        //cambia cadena

        public MasRendimiento(string cadena) : this()

        {

            _cadena = cadena;

        }

        //Campos a valor por defecto y luego

        //cambia a y cadena

        public MasRendimiento(int a, string cadena)

            : this()

        {

            _a = a;

            _cadena = cadena;

        }

    }



Esta es la "magia" que nos aporta C#, que mediante "this" podamos llamar de un constructor a otro.

sábado, 5 de septiembre de 2009

Backup con SMO en C#

Así ya tenemos a los hermanitos (un ejemplo en el blog en VB y otro en C#):

try
{
    using (SqlConnection cn = new SqlConnection(llConexion.Text))
    {
        cn.Open();
        serverConnection = new ServerConnection(cn);
        Backup bck = new Backup();
        bck.Database = serverConnection.DatabaseName;
        bck.Devices.Add(new BackupDeviceItem(rutaBackup + @"\" + serverConnection.DatabaseName + ".BAK", DeviceType.File));
        bck.Action = BackupActionType.Database;
        bck.SqlBackup(new Server(serverConnection));
        MessageBox.Show("Proceso completado");
    }          
}
catch (SmoException ex)
{
    MessageBox.Show(ex.Message);
}

Kill a todas las conexiones de una BD con SMO

Ahí va un post sencillito con SMO:

using (SqlConnection cn = new SqlConnection(llConexion.Text))
{
    cn.Open();
    serverConnection = new ServerConnection(cn);
    Server server = new Server(serverConnection);
    server.KillAllProcesses(serverConnection.DatabaseName);
    MessageBox.Show("Proceso terminado");
}


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,
ServerConnection serverConnection = new ServerConnection(cn);)

viernes, 4 de septiembre de 2009

Teclas rápidas IE 8

Me 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:

http://www.microsoft.com/spain/windows/products/winfamily/ie/quickref.mspx

Que gozada, CTRL+TAB, CTRL+MAY+TAB, ALT+Inicio, CTRL+T, con estas me conformo y luego las pijadillas CTRL+Q

miércoles, 2 de septiembre de 2009

[OT] Teléfono Windows

Má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:

- 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.
- En Europa: operadoras móviles Orange, Deutsche Telekom AG y Vodafone Group Plc, y fabricantes Acer, HTC, LG Electronics, Samsung, Sony Ericsson y Toshiba
- Latinoamérica: operadoras móviles TIM Brazil, y fabricantes HTC, LG Electronics y Samsung
- 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

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.

Fuente: http://windowsteamblog.com/blogs/windowsphone/archive/2009/09/01/windows-phones-are-coming-on-october-6th.aspx