Páginas

jueves, 29 de mayo de 2014

Exportar un DataTable a Excel desde C#

Estimados Corregí un error en el código, paso la variable dt como parametro tipo DataTable.


Un pequeño pero muy útil fragmento de código que explica como exportar desde C# un DataTable a Excel, espero que sea de gran ayuda para el lector saludos.

Codigo:

using xls = Microsoft.Office.Interop.Excel;
/////AQUI TODO LO DEMAS:..
namespace Prueba
{
    public class Excel
    {
public void exportXLS(DataTable dt)
{
          var lines = new List();
            string[] columnNames = dt.Columns.Cast().
                                              Select(column => column.ColumnName).
                                              ToArray();

            var header = string.Join(((char)9).ToString(), columnNames);
            lines.Add(header);

            var valueLines = dt.AsEnumerable()
                               .Select(row => string.Join(((char)9).ToString(), row.ItemArray));
            lines.AddRange(valueLines);
            string cArchivo = "suarchivo.xls";
            
            File.WriteAllLines(cArchivo, lines);
            oXL = new xls.Application();
            oXL.Workbooks.Open(cArchivo);
            oXL.Visible = true;
}
}
}

martes, 26 de marzo de 2013

Hacer hablar a tu aplicación de .NET

En .NET podemos hacer fácilmente que nuestra aplicación lea un texto gracias al sintetizador de voz de Microsoft, por defecto en nuestro Windows tenemos la Voz de Anna, en Idioma ingles, pero podemos bajar  otros idiomas y otras voces, en la siguiente aplicación enumeramos las voces en un listbox para luego seleccionarla para que lea el texto que se encuentra en el textbox cuando presionemos el botón.


Código:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SpeechLib;
namespace PruebaDeVoz
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
      
        }
        SpVoice v = new SpVoice();
        private void button1_Click(object sender, EventArgs e)
        {
            v.Voice = v.GetVoices().Item(listBox1.SelectedIndex);
            v.Speak(textBox1.Text);
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            foreach (ISpeechObjectToken  voz in v.GetVoices())
            {
                listBox1.Items.Add(voz.GetDescription());
            }             
        }
    }
}

Espero que le sea de utilidad esta entrada, podrán darse cuenta que es realmente sencillo sintetizar voz gracias a la tecnología Microsoft.

martes, 19 de junio de 2012

Exportar Base de Datos de Oracle 11g a Oracle 10g

Siempre es fácil exportar de una versión anterior a una nueva, ya que la nueva tiene las características de reconocer formatos anteriores, sin embargo uno de los problemas sería intentar que un archivo DMP generado de la versión 11g por ejemplo, sea reconocido en la versión 10g.
Siempre había estado acostumbrado hacer una exportación simple con el comando “Exp” , lo he utilizado sin problema. Cuando me encontré con la necesidad de exportar hacia una versión inferior ya no funcionó, después de buscar en algunos foros encontré la solución, exportación por medio del comando “EXPDP” este me crea un dumpfile, en el que puedo especificarle la versión con la que necesito compatibilidad.
Un ejemplo de línea de comando en una base de datos 11g puede ser:
expdp miuser/mipass@midb schemas=miesquema dumpfile=mifile.dmp  version=10
En este comando le especifico que lo quiero con compatibilidad de versión 10
El archivo se va a generar en el directorio oracle:  DATA_PUMP_DIR, cuando deseamos importarlo, debemos revisar si existe el directorio DATA_PUMP_DIR en la base de datos destino, si no existe debemos crear ese directorio, tanto a nivel de sistema operativo como a nivel de Oracle.  una vez que estemos seguros de la existencia y la ruta, el archivo debe copiarse en el directorio antes mencionado para poder ser importado, se importa de la siguiente manera:
impdp userid=tuuser/tupass schemas=tuesquema dumpfile=tufile.dmp
Espero que sea de ayuda.

martes, 15 de mayo de 2012

Receta de procmail AntiSpam

Cuando trabajamos con Linux y Sendmail como servidores  de correo electrónico tenemos algunos productos antiSpam en el mercado que podemos usar, uno de ellos es vexira, o los que vienen pre instalados en linux como el SoamAssasin aún con esos programas aunque puedes incluso configurarlos creando listas blancas y negras, también tienes la opción de usar procmail directamente para filtrar el correo electrónico. una receta que me ha servido mucho para filtrar el correo que deja pasar “vexira” y enviarlo a un buzón temporal para su revisión de posibles falsos positivos es la siguiente:
## se Intentaran crear filtros de correos SPAM para ayudar al Vexira con este trabajo
:0
* ^Subject:(.*Acai|.*Treat|.*Viagr|.*manhood|.*Viagra|.*Setup|.*Twitter|.*lover|.*nude|.*exotic|.*energy|.*libido|.*bikini|.*male|.*prescription|.*pills|*.Enhancing|.*virility|.*luxury|.*orgasm|.*Astounding|.*Enlarging|.*Penis|.*Free|.*Obama|.*answer|.*health|.*spears|.*jolie|.*discount|.*empower|.*Pharmacy|.*tudominio.com|.*dollars|.*trials|.*sexual|.*transaction|.*sales)
/var/spool/mail/jackspam
###:0
###$DEFAULT
esta receta debe ser modificada a medida se vayan notando asuntos comunes en los Spam.
hasta ahora los falsos positivos que me ha dado esta receta es apenas del 2% nada mal para una simple receta de procmail.
espero esto le sirva.

viernes, 13 de abril de 2012

Crear Aplicaciones para Android ¡Sin Saber Programar!

Bueno, depende el tipo de usuario que seamos, nos vamos a preguntar si alguna vez podremos hacer algo que hasta ahora solo podíamos usar pero que no tenemos la menor idea de como se hace, por lo tanto no podremos hacer algo propio.. en mi caso me pasa con el Hardware, me gustaría saber como poder fabricar un Microprocesador, no tengo la menor idea de como hacerlo, pero en este caso pues no lo puedo hacer Triste, en la programación sin embargo me defiendo bastante, pero pues, tenemos personas que sin saber programar desearían tener una aplicación propia, mas que nada en Su móvil, una aplicación sencilla, que se les ocurrió mientras tenían una necesidad, y que hasta ahora era imposible pensar que sin los conocimientos técnicos suficiente se podría lograr esto, Google a pensado en estas personas y a creado el AppInventor for Android, donde el usuario con conocimientos básicos de computación podrá crear su app sin necesidad de escribir líneas de código. Sin mas que decirles los dejo con el Link de esta interesante herramienta que seguro les gustará http://www.appinventor.es/configuracion.php

viernes, 17 de febrero de 2012

Comparación de dos instancias de una Clase Compleja en C#

Una de las funciones mas útiles es “Equals” nativo de la clase tipo object, esto nos ayuda a comparar si una instancia de un objeto es igual a otra, pero cuando contamos con clases un poco mas complejas, donde tenemos varias propiedades, los resultados tal vez no sean muy coherentes, en este caso es mejor realizar un algoritmo de comparación, para esto debemos hacer que nuestra clase esté basado en la Interface IEquatable, y programarla función “Equals”, ahora esto puede ser un asunto muy engorroso si tenemos bastantes propiedades que queremos comparar, y es en este momento que podemos utilizar “Reflection”, en el siguiente ejemplo crearé una clase “credito” con algunas propiedades basada a la interface IEquatable, y en la programación de la función Equals usaremos reflection, para evitar comparar propiedad por propiedad, esto es bastante útil cuando se tiene bastante bastantes propiedades:
   1: public class credito:IEquatable<credito>

   2: {

   3:     public Decimal credito_id { get; set; }

   4:     public String vendedor_id { get; set; }

   5:     public String estado { get; set; }

   6:     public String cliente_id { get; set; }

   7:     public String nombre { get; set; }

   8:     public String apellido { get; set; }

   9:     public DateTime fecha_nac { get; set; }

  10:     public String direccion_domicilio { get; set; }

  11:     public String telefono_domicilio { get; set; }

  12:     public Double numero_cuotas { get; set; }

  13:     public String cedula_conyuge { get; set; }

  14:     public String nombre_conyuge { get; set; }

  15:     public String observacion { get; set; }

  16:     public String email { get; set; }

  17:     public Int64 cotizacion_id { get; set; }

  18:     /// <summary>

  19:     /// Permite realizar comparaciones del objeto de este  tipo 

  20:     /// desarrollado por Patricio Rosado 

  21:     /// </summary>

  22:     /// <param name="other"></param>

  23:     /// <returns></returns>

  24:     public bool Equals(credito other)

  25:     {

  26:         //Se Obtienen la lista de propiedades de los objetos para compararlos uno a uno.

  27:         PropertyInfo [] prop1 =GetType().GetProperties();

  28:         PropertyInfo [] prop2 =GetType().GetProperties();

  29:         for (int i = 0; i < prop1.Length; i++)

  30:         {

  31:             // en caso de que ninguno de las dos propiedades no sean nulas, se comparan.

  32:             if (prop1[i].GetValue(this, null) != null && prop2[i].GetValue(other, null) != null)

  33:             {

  34:                 if (!prop1[i].GetValue(this, null).Equals(prop2[i].GetValue(other, null)))

  35:                     return false;

  36:             }

  37:             else

  38:             {

  39:                 //Caso contrario se revisa que los dos estén nulos, si uno de los dos no es nulo 

  40:                 //Se retorna False.

  41:                 if (prop1[i].GetValue(this, null) == null && prop2[i].GetValue(other, null) != null)

  42:                     return false;

  43:                 if (prop1[i].GetValue(this, null) != null && prop2[i].GetValue(other, null) == null)

  44:                     return false;

  45:             }

  46:         }

  47:         return true;

  48:     }

  49: }

no olvidar hacer un using System.Reflection;

martes, 27 de diciembre de 2011

¿Por que usar Shared Server en Oracle Database?

Una de las cosas que debemos tomar en cuenta cuando tenemos base de datos Oracle, es la cantidad de procesos en el servidor que se pueden ejecutar por cada cliente conectado a la base de datos, estos procesos consumen memoria del servidor, y cuando los requerimientos a la base de datos aumentan, y existen muchas conexiones concurrentes, se nos hace un problema cuando estos procesos se consumen la memoria del servidor.
Oracle tiene una solución bastante practica para estos “problemas” y son los servidores compartidos, con la configuración correcta podemos hacer que varios clientes sean atendidos por un solo proceso en el servidor, estos procesos son llamados despachadores o dispatchers.
Haciendo una balanza se puede hacer que ciertos usuarios tengan conexión a un servidor dedicado, mientras la mayoría este con servidores compartidos, mas información sobre como configurar servidores compartidos en Oracle Database lo encontramos en el siguiente link http://docs.oracle.com/cd/B19306_01/network.102/b14212/dispatcher.htm