6
May/08
5

Truco: Refactorizar código con Encapsular campo

Para todos aquellos que usamos Visual Studio 2005, el otro dia descubri un pequeño truco que puede ahorrarte unos minutos de picar código.

Si estas enfrascado en la tarea de crear una clase, declaras sus variables con acceso private y a continuación toca picar sus funciones de acceso, los get y set de cada campo. Pues bien, Visual Studio tiene una herramienta que nos ayuda con esta tarea.

Una vez declarados los campos, nos colocamos sobre el nombre de la variable, hacemos botón derecho –> Refactorizar –> Encapsular Campo. indicamos OK y nos declara automaticamente una propiedad para ese campo con la que podremos acceder l valor.

Dejo link a msdn dónde esta explicado con más detalle:

http://msdn.microsoft.com/es-es/library/xs0y516a(VS.80).aspx

En C# existe esta posibilidad por defecto, para aprovecharla en VB .NET necesiatremos un producto como Refactor!

Descarga: http://www.devexpress.com/Products/NET/IDETools/VBRefactor/

6
May/08
0

Pasar parámetros a un Thread

Esto esta muy abandonado…

Hago una pequeña aportación sobre como pasar parámetros a un Thread mediante el uso de delegados, que puede resultar muy útil:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System.Threading;
 
private void button1_Click(object sender, EventArgs e)
{
ThreadStart tstart = delegate { metodo("Test"); };
 
Thread t = new Thread(tstart);
 
t.Start();
 
}
private void metodo(String mensaje)
 
{
 
MessageBox.Show(mensaje);
 
}

*Un delegate es un objeto que referencia a un método. Siempre que el delegate es invocado, el método referenciado por éste es también llamado.

Categoria: .NET
10
Abr/08
1

Ordenar una Colección

El otro día descubrí que .NET tiene un método para ordenar colecciones. El método es .Sort() obvio, no? Pues nunca me había fijado o no lo había necesitado.

Este método nos devuelve una colección con todos nuestros ítems ordenados.

Para hacer la ordenación, tendremos que indicarle con que criterio queremos que la ordene. Para esto crearemos una nueva función.

Tomamos como ejemplo una colección del tipo List que contenga objetos Persona.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
List<Persona> personas = new List<Persona>();
 
        class Persona
        {
 
            private String DNI;
 
            private String nombre;
 
            private int edad;
 
            public Persona()
            {
 
            }
 
            public Persona(String DNI, String nombre, int edad)
            {
 
                this.DNI = DNI;
 
                this.nombre = nombre;
 
                this.edad = edad;
 
            }
 
            public String getDNI()
            {
 
                return this.DNI;
 
            }
 
            public String getNombre()
            {
 
                return this.nombre;
 
            }
 
            public int getEdad()
            {
 
                return this.edad;
 
            }
 
        }

Definimos una nueva función.

1
2
3
4
private int funcion_ordena_nombre(Persona x, Persona y)
{
      return x.getNombre().CompareTo(y.getNombre());
}

Podemos definir los criterios de nuestra funcion de ordenacion teniendo en cuenta que el valor del int que devolvemos tiene el siguiente significado.

Menor que cero –> Esta instancia es menor que obj.

Cero –> Esta instancia es igual a obj.

Mayor que cero –> Esta instancia es mayor que obj.

Ahora llamamos al método Sort indicándole el nombre de nuestra nueva función.

1
personas.Sort(funcion_ordena_nombre);

Imprimimos el contenido del List para comprobar que esta ordenado.

1
2
3
4
5
foreach (Persona per in personas)
{
      Console.Out.WriteLine("DNI: " + per.getDNI() + " Nombre: " + per.getNombre() + " Edad: " + per.getEdad());
}
Console.Out.WriteLine();

Puede interesarnos crear un Dictionary con todos nuestros métodos de ordenación personalizados.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Metodos_Ordenacion_Personas
        {
            private static Dictionary<string, Comparison<Persona>> vMetodos;
 
            public static Dictionary<string, Comparison<Persona>> metodosOrdenacion
            {
                get
                {
                    return vMetodos;
                }
            }
 
            static Metodos_Ordenacion_Personas()
            {
                vMetodos = new Dictionary<string, Comparison<Persona>>();
                vMetodos["ByDNI"] = compareByDNI;
                vMetodos["ByNombre"] = compareByNombre;
                vMetodos["ByEdad"] = compareByEdad;
            }
 
            private static int compareByDNI(Persona x, Persona y)
            {
                return x.getDNI().CompareTo(y.getDNI());
            }
 
            private static int compareByNombre(Persona x, Persona y)
            {
                return x.getNombre().CompareTo(y.getNombre());
            }
 
            private static int compareByEdad(Persona x, Persona y)
            {
                return x.getEdad().CompareTo(y.getEdad());
            }
        }

Y para utilizar uno de estos metodos:

1
2
3
4
5
6
7
string metodo = "ByNombre";
Comparison<Persona> metodoOrdenacion;
 
if (Metodos_Ordenacion_Personas.metodosOrdenacion.TryGetValue(metodo, out metodoOrdenacion))
{
      personas.Sort(metodoOrdenacion);
}
Categoria: .NET
1
Abr/08
4

Introducción a log4Net

Vamos a introducir Log4net que es parte del proyecto Apache Logging Services. Es una herramienta para ayudar a los programadores a generar ficheros de salida con diferente información y trazas que ayudara a depurar el desarrollo.

Descargar Log4Net

Para descargar Log4Net podemos acceder a la siguiente url:

http://logging.apache.org/log4net/download.html

Y nos bajamos el .zip con la última versión en release. En este caso se trata de log4net 1.2.10 (zip). Descomprimimos su contenido.

Creamos un proyecto de prueba con Visual Studio 2005. Una aplicación de Windows en C# por ejemplo.

Nos vamos a referencias y agregamos la librería log4net.dll que encontramos en log4net-1.2.10\bin\net\2.0\release

Hacemos la importación de los siguientes espacios de nombres:

1
2
using log4net;
using log4net.Config;

Configuración Log4Net

Todos los parámetros configuables de log4Net se encuentran en un archivo llamado log4net.xml que debe contener la siguiente estructura.

Indicamos un name y el tipo que deseamos.

<log4net>
 
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">

Indicamos la ruta y el nombre donde queremos que genere el fichero, el tamaño maximo que queremos que adquiera el log, etc…

<file value="log\Log1.log" />
<appendToFile value="true" />
<maximumFileSize value="100KB" />
<maxSizeRollBackups value="2" />

Indicamos el formato que queremos que aparezca en cada nueva linea del log

<layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%d{dd-MM HH:mm:ss} %5level %logger - %message%newline"/>
  </layout>
</appender>

Podemos añadir tantos ficheros de log como queramos.

<appender name="Log" type="log4net.Appender.RollingFileAppender">
  <file value="log\Log2.log" />
  <appendToFile value="true" />
  <maximumFileSize value="100KB" />
  <maxSizeRollBackups value="2" />
 
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%d{dd-MM HH:mm:ss} %message%newline" />
  </layout>

También podemos añadir un filtro al Log, y que solo aparezcan en este aquellas lineas que contengan una determinada cadena de texto. (En este caso: Filtro)

  <filter type="log4net.Filter.StringMatchFilter">
    <stringToMatch value="Filtro" />
  </filter>
  <filter type="log4net.Filter.DenyAllFilter" />
</appender>

Aquí podemos configurar el nivel del Log, si solo queremos que aparezcan los de nivel Info, Debug, etc… y indicamos a que configuración hace referencia.

  <root>
    <level value="DEBUG" />
    <appender-ref ref="RollingFile" />
    <appender-ref ref="Log" />
  </root>
</log4net>

*Log4Net dispone de muchas mas opciones de configuración que puedes consultar aquí:

http://logging.apache.org/log4net/release/config-examples.html

Una vez configurado, lo primero que tendremos que hacer sera cargar la configuración del log4Net con la siguiente sentencia, indicandole la ruta donde guardaremos el XML con los parametros de configuración:

1
XmlConfigurator.Configure(new System.IO.FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.xml"));

Después, tenemos que crear la variable:

1
ILog log_ = log4net.LogManager.GetLogger("log4Net");

Pudiendole pasar al metodo GetLogger como parametro un String identificativo que nos vaya bien.

Y ya popdemos empezar a escribir nuestros logs usando la variable log_.

Podemos escribir diferente niveles de log, a nivel de Info, de Debug, de Error o de Warn según el caso.

Después podremos indicar hasta que nivel queremos que salga en el log.

Ejemplo sencillo de utilización

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
XmlConfigurator.Configure(new System.IO.FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.xml"));
ILog log_ = log4net.LogManager.GetLogger("log4Net");
 
log_.Info("Log4Net Activado");
int i = 6;
int k = 2;
 
if (i != 0)
{
        try
        {
            float res = i / k;
            log_.Debug("Se realiza la operacion, obteniendo como resultado: " + res.ToString());
        }
        catch (Exception ex)
        {
            log_.Error("Error no controlado", ex);
        }
}
else
{
      log_.Warn("No se puede dividir por 0!");
}

Este seria el archivo de log que nos generaria este trozo de código.

01-04 02:25:23 INFO log4Net - Log4Net Activado
01-04 02:25:23 DEBUG log4Net - Se realiza la operacion, obteniendo como resultado:3

Si después de estas indicaciones, te interesa profundizar en el tema, visita la pagina:

http://logging.apache.org/log4net/index.html

* También existe la versión log4j que es la variante para el lenguaje de Java y tiene un funcionamiento similar, para saber más:

http://logging.apache.org/log4j/index.html

Categoria: .NET
31
Mar/08
2

Acceder a MySQL desde .NET

Vamos a explicar brevemente como conectarnos a una BD MySQL con .NET, esta explicación la haremos utilizando C#.

El único requisito será tener el Framework .NET 2.0 instalado.

Para realizar la conexión utilizaremos el Connector/Net

Descargar Connector/Net

Encontramos el conector disponible para descargar en la dirección:

http://dev.mysql.com/downloads/connector/net/5.1.html

Hay dos tipos diferentes de instalación, mediante un archivo .msi que seria Windows Binaries (ZIP) o los archivos sin instalador Windows Binaries, no installer (ZIP).

En este caso escogemos la versión sin el instalador.

Nos descargamos el .zip y descomprimimos el contenido.

Ahora lo único que nos queda para poder utilizar las clases que nos permitan acceder a MySQL es agregar a las referencias de nuestro proyecto la librería MySql.Data.dll que se encuentra en la carpeta bin del contenido descargado.

Hacemos la importación del namespace:

1
using MySql.Data.MySqlClient;

Una vez tengamos esto hecho, ya popdemos programar el acceso a la BD de la forma habitual, similar al acceso con ADO. NET.

Un ejemplo sencillo de implementación.

Creamos una nueva conexión y le asignamos la cadena de conexión que queramos utilizar.

1
2
MySqlConnection conn = new MySqlConnection();
conn.ConnectionString = "Server=localhost;Database=test;Uid=root;Pwd=12345;";

Abrimos la conexión y preparamos un nuevo comando con la sentencia que queremos ejecutar.

1
2
3
conn.Open();
MySqlCommand cmd = new MySqlCommand();
string strCmd = "INSERT into categoria values(null , 'Division')";

Le asignamos la conexión al comando y hacemos el Execute, ExecuteReader, etc… según nos convenga.

1
2
3
cmd.Connection = conn;
cmd.CommandText = strCmd;
cmd.ExecuteNonQuery();

Finalmente, cerramos la conexión.

1
conn.Close();

*El Connector/Net también esta soportado por Linux a través de Mono.

Better Tag Cloud