Sunday, July 29, 2012

Manejo de fechas en SQL Server

Todavía recuerdo aquellos tiempos en los que programaba en VB 6 y SQL Server, era un relajo el manejo de fechas ya que el cliente y servidor (y en la mayoría de los casos) difiere el formato de la fecha, por ejemplo en el cliente pueden tener el formato de fecha dd/MM/yyyy y en el servidor MM/dd/yyyy.


Con la llegada de .NET se terminó eso, pero me he dado que nuestros vecinos del norte (EU) todavía se les dificulta ese manejo (y lo sé porque tenemos proveedores de EU).


La manera sencilla es la siguiente:


1. Creamos un comando.
2. Agregamos los parametros.
3. Ejecutar consulta.


Ahora el código:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
 
namespace ConsoleApplication1
{
 
 class Program
 {
 
  static void Main(string[] args)
  {
   
   // Establecemos la conexión
   SqlConnection connection = new SqlConnection("CADENA DE CONEXION");
   connection.Open();
 
   // Creamos y configuramos el comando
   SqlCommand command = new SqlCommand();
   command.Connection = connection;
   command.CommandType = System.Data.CommandType.Text;
   command.CommandText = "SELECT * FROM Registros WHERE fechaAlta = @fecha";
 
   // Agregamos el parámetro
   command.Parameters.Add(new SqlParameter()
   {
    ParameterName = "@fecha",
    SqlDbType = System.Data.SqlDbType.Date,
    Value = DateTime.Today
   });
 
   // Ejecutamos la consulta
   using (SqlDataReader reader = command.ExecuteReader())
   {
 
    // Recorrer los registros
    while (reader.Read())
    {
     // Hacer las operaciones correspondientes
     Console.WriteLine(reader["registro"]);
    }
 
   }
 
   // Cerrar conexión
   connection.Close();
   connection.Dispose();
 
   // Destruir objetos
   command = null;
   connection = null;
 
   Console.WriteLine("Presione cualquier tecla para continuar ...");
   Console.ReadKey(true);
 
  }
 
 }
 
}

Como ven usando parametros nos quitamos de ese dolor de cabeza.

Tuesday, July 24, 2012

SharePoint BDC

Trasteando un rato el BDC (Business Data Connectivity) de SharePoint 2010, es una herramienta que nos permite manipular datos de otras bases de datos, todo desde el entorno de SharePoint.

Casi siempre el problema al crear ese tipo de soluciones es la cadena de conexión u otras configuraciones, ya saben que no es lo mismo desarrollar en un ambiente de pruebas a un ambiente de producción.

Cuando pasas a producción un desarrollo tienes que cambiar varias configuraciones y las más comunes son los datos de conexión a las bases de datos.

Esta solución que plantea es mucho mas sencilla de las encontradas en la red, no quiere decir que sea la mejor y más óptima, pero a final de cuentas nos saca del apuro.

Quiero mencionarles que hice un módelo BDC basado en este ejemplo:


A partir de ahi todo es sencillo, código .NET de toda la vida

1. Mapear el folder Layouts.
2. Dentro del folder Layouts creamos una carpeta llamada "BDC" o cualquier nombre que se representativo de la aplicación.
3. En el folder creado en el paso anterior agregamos un archivo XML llamado Settings.xml.
4. Editamos el archivo para especificar las configuraciones, para este ejemplo asi lo hice;

<?xml version="1.0" encoding="utf-8" ?>
<settings>
 <setting id="ConnectionString" value="SERVER=.; DATABASE=BD; UID=usuario; PWD=password;" />
</settings>
5. Agregamos la referencia System.Web
6. Hacer una funcion que lea el xml y devuelva la configuración solicitada

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Xml;
 
namespace JehutyX.BDC
{
 
 public static class Global
 {
 
  public static string GetSetting(string fileName, string id)
  {
   string result = string.Empty;
 
   // Cargar archivo
   XmlDocument doc = new XmlDocument();
   doc.Load(HttpContext.Current.Server.MapPath("/_layouts/BDC/" + fileName));
 
   // Recuperamos el nodo
   XmlNode node = doc.DocumentElement.SelectSingleNode("./setting[@id = '" + id + "']");
 
   // Si es válido
   if (node != null)
   {
    // Recuperamos el valor
    result = node.Attributes["value"].InnerText;
   }
 
   // Destruir objetos
   node = null;
   doc = null;
 
   // Regresar resultado
   return result;
 
  }
 
 }
  
} 

7. En la clase que genera el Modelo donde viene el código de nuestros métodos (en mi caso se llama EquipmentEntityService.cs), quedaría así:

  public static Equipo ReadItem(int id)
  {
   Equipo result = new Equipo();
   Connection connection = new Connection(Global.GetSetting("EquipmentModel.xml""ConnectionString"));
 
   try
   {
    connection.Open();
    connection.AddParameter("@id"SqlDbType.BigInt, id);
 
    using (SqlDataReader reader = connection.ExecuteReader("SELECT * FROM Equipos WHERE id = @id"))
    {
 
     if (reader.Read())
     {
      result.ID = reader.GetInt32("id", 0);
      result.Nombre = reader.GetString("nombre");
      result.Ubicacion = reader.GetString("ubicacion");
      result.NumeroEquipos = reader.GetInt32("numeroEquipos", 0);
      result.NumeroActivo = reader.GetString("numeroActivo");
      result.Marca = reader.GetString("marca");
      result.Modelo = reader.GetString("modelo");
      result.NumeroSerie = reader.GetString("numeroSerie");
      result.AlcanceOpNominal = reader.GetString("alcanceOpNominal");
      result.IntervaloUso = reader.GetString("intervaloUso");
      result.Magnitud = reader.GetString("magnitud");
      result.ExactitudFabrica = reader.GetString("exactitudFabrica");
      result.Resolucion = reader.GetString("resolucion");
      result.ToleranciasProceso = reader.GetString("toleranciasProceso");
      result.CriteriosRiesgo = reader.GetString("criteriosRiesgo");
      result.EstadoActual = reader.GetString("estadoActual");
      result.Observaciones = reader.GetString("observaciones");
     }
 
    }
 
   }
   catch (Exception)
   {
 
    throw;
   }
   finally
   {
    connection.Dispose();
    connection = null;
   }
 
   // Regresar resultado
   return result;
 
  }
La siguiente línea de código es donde ejecuto el método GetSetting, le paso el nombre del archivo XML y la configuración que quiero obtener
Connection connection = new Connection(Global.GetSetting("Settings.xml""ConnectionString"));

El nombre del archivo lo pueden omitir y poner directamente en el código del método GetSetting.

Y listo, ya podemos tener las configuraciones que queramos y usarlas en nuestra solución de SharePoint.

Friday, July 20, 2012

Tutorial HTML5

Esta fuerte la fiebre por el HTML5 pero no deja de ser una tecnología más y para aquellos interesados en aprender Microsoft ha publicado un curso


http://msdn.microsoft.com/es-es/ie/hh749019

Buen provecho!

Wednesday, July 18, 2012

Extension Methods

Los Extension Methods nos permite agregar métodos a cualquier tipo u objeto en .NET.


Estos son muy útiles cuando tengamos que realizar una operación recurrente para un tipo en especifico, por ejemplo, es muy común que queramos convertir un string a número, podemos realizar una clase y que contenga la función o bien solo usando el método Parse del tipo int.


Veamos el ejemplo de convertir el número


El código tradicional es

string text = "123";
int number1 = int.Parse(cadena);
int number2 = Convert.ToInt32(cadena);


Eso es suponiendo que siempre va haber un número válido siempre, pero que pasa cuando dependemos de lo que capture el usuario, deberiamos poner una validación y si no es un número válido que nos regrese un valor por default que le especifiquemos:

(Supongamos que el método esta en una clase estatica llamada Functions)


public static int ToInteger(string text, int defaultValue)
{
     int result;


     if (!int.TryParse(text, out result)) result = defaultValue;


     return result;

}


mandamos a llamar el método:


string text = "123";
int number1 = Functions.ToInteger(text, 0);


Como todo buen programador uno busca optimizar el código y esta es otra forma de llegar al mismo resultado, convertamos este método a un método extendido



public static int ToInteger(this string text, int defaultValue)
{
     int result;


     if (!int.TryParse(text, out result)) result = defaultValue;


     return result;

}


¿Que cambio? simple, al parámetro text le antepusimos el this, con eso le indicamos que ese método se va agregar al tipo string en tiempo de ejecución, como lo llamamos?


string text = "123";
int number1 = text.ToInteger(0);


Básicamente lo mismo pero ese método que creamos ya va estar disponible para cualquier objeto de tipo string.


Puede que no le vean tanta utilidad por el momento pero creanme que con el tiempo los van a llegar a querer.


Si tienen preguntas con gusto se las respondo.



Experiencia

Llevo cerca de 10 años trabajando con la plataforma .NET y todavía sigo aprendiendo nuevas cosas acerca de todo lo que saca Microsoft. Todo el tiempo he hecho sistemas usando productos de Microsoft y me encanta, no es que sea un fanático de dicha empresa pero reconozco cuando hace las cosas bien y sobre todo es lo que me da de comer. Ha llegado el momento de compartir el conocimiento que he adquirido en todo este tiempo, muchas de ellas pueden involucrar cosas de SharePoint, ASP.NET, Silverlight, etc, lo que se me venga a la mente y obviamente que pueda ayudar a la comunidad. -Jehuty X