miércoles, 3 de febrero de 2010

Transacciones en C# con SQL Server

A continuación pongo un pequeño ejemplo de como implementar una transacción dentro de una operación CRUD contra una base de datos.

private static int Insert(TransporteEntidad transporte)
{
string sql = @"INSERT INTO Transportes ([Nombre]
,[Activo]
,[Fecha_Activo])
VALUES (@Nombre,
@Activo,
@Fecha_Activo)"
using SqlConnection conn = new SqlConnectionConfigurationManager.ConnectionStrings["CadenaConexion"].ToString()))
{
SqlCommand command = new SqlCommand(sql, conn);
SqlTransaction transaccion = null;
command.Parameters.AddWithValue("Nombre", transporte.Nombre);
command.Parameters.AddWithValue("Activo", transporte.Activo);
command.Parameters.AddWithValue("Fecha_Activo", transporte.Fecha_Activo);
conn.Open();
transaccion = conn.BeginTransaction(IsolationLevel.RepeatableRead);
command.Transaction = transaccion;
int resultado;
try
{
resultado = command.ExecuteNonQuery();
transaccion.Commit();
}
catch (Exception ex)
{
transaccion.Rollback();
resultado = 0;
new Excepciones(ex, "ROLLBACK")
}
return resultado;
}
Como comentario simplemente decir que el método BeginTransaction() admite varios tipos de parámetros, dependiendo del modo de aislamiento que queramos usar en nuestra base de datos. Podemos ver un poco mas en http://msdn.microsoft.com/es-es/library/system.data.isolationlevel.aspx  Otra página bastante interesante para mi es Transacciones y modos de aislamiento en SQL Server y .NET, en la cual pone además un ejemplo básico de utilización en SQL Server y otro en ADO .NET

Respecto a la instruccion using(){}, con ella conseguimos asegurarnos de que siempre se cierre la conexión, pase lo que pase (por eso no necesitamos incluir el conn.Close();

En el caso de querer realizar operaciones en bloque con tablas relacionadas por ejemplo, podremos usar SqlTransaction, de forma que abstraemos el manejo de transacciones a las demás capas de la arquitectura (si trabajamos en una arquitectura de n-capas) aunque puede ser una solución costosa en diseño si no se planifica bien (yo aún no lo he ocnseguido) o también podemos usar TransactionScope si queremos manejar las operaciones desde la capa de negocio, por ejemplo. Pero esto, para otra ocasión.

lunes, 21 de diciembre de 2009

Expresiones regulares: Fecha

Las expresiones regulares o patrones no son más que un grupo de caracteres orientados a cumplir una determinada condición. Por ejemplo, si queremos validar un número de DNI podemos hacerlo mediante sentencias if anidadas, comprobando su longitud, si contiene números o letras, etc. y también podemos hacerlo comparándola con una expresión regular. No entraré mucho en detalle, porque hay bastantes sitios que lo explican y seguro que además lo hacen mucho mejor que yo.
Pongo a continuación alguno de los sitios que he consultado:
Expresiones regulares en la Wikipedia.
Tutorial rápido para crear expresiones regulares (está en inglés):
http://www.regular-expressions.info/
Buscador de expresiones regulares:
http://regexlib.com/
Bueno, la principal razón por la que he abierto este post es la de incluir la expresión regular que he (iba a decir creado) adaptado a mis gustos desde otras que he encontrado por ahi. Es para validar campos con la fecha, no solo en lo que es el formato en sí sino también que los valores sean los correctos. La he limitado a los años 2000-2099 por comodidad, y he incluido seis formatos diferentes: 21/12/2000 21/12/09 21-12-2009 21-12-09 21122009 211209 De esta forma, contemplo las formas más comunes de escribir la fecha. el objetivo es que al introducir la fecha en un textbox me permita validarla. Adicionalmente, se podría utilizar también las expresiones regulares para convertir la fecha a un formato concreto, para que al resultar válidas las transforme a un formato concreto.
He dividido la expresión en dos patrones, para que el que quiera usar uno solo pueda hacerlo.
//Formato de Fecha: 12/12/2009 12-12-2009 12122009
//Fecha Minima: 01/01/2000
//Fecha Maxima: 31/12/2099
string Patron1 = "(((0[1-9]|[12][0-9]|3[01])([/]|[-])?(0[13578]|10|12)([/]|[-])?(’’d{4}))" +
"|(([0][1-9]|[12][0-9]|30)([/]|[-])?(0[469]|11)([/]|[-])?(’’d{4}))" +
"|((0[1-9]|1[0-9]|2[0-8])([/]|[-])?(02)([/]|[-])?(’’d{4}))" +
"|((29)([/]|[-])?(02)([/]|[-])?((20)[02468][048]))" +
"|((29)([/]|[-])?(02)([/]|[-])?((20)[13579][26])))";

//Fecha 12/12/09 12/12/09 121209
//Fecha Minima: 01/01/00
//Fecha Maxima: 31/12/99
string Patron2 = "(((0[1-9]|[12][0-9]|3[01])([/]|[-])?(0[13578]|10|12)([/]|[-])?(’’d{2}))" +
"|(([0][1-9]|[12][0-9]|30)([/]|[-])?(0[469]|11)([/]|[-])?(’’d{2}))" +
"|((0[1-9]|1[0-9]|2[0-8])([/]|[-])?(02)([/]|[-])?(’’d{2}))" +
"|((29)([/]|[-])?(02)([/]|[-])?([02468][048]))" +
"|((29)([/]|[-])?(02)([/]|[-])?([13579][26])))";

string Patron = "^("+Patron1+"|"+Patron2+")$";

Regex ExpresionRegular = new Regex(Patron);

if(ExpresionRegular.IsMatch(this.textBox1.Text.ToString()))
{
}

Básicamente lo que hacemos es buscar primero si coincide con los meses que tienen 31 días, con las opciones de todo junto, con / o con –. Después vemos si coincide con alguno de los meses que tienen 30 días, después valida la fecha del 28 de febrero, y por último si el día es el 29 comprueba que el año sea bisiesto. En otro momento, si tengo ganas y tiempo podré el código que compruebe el textbox, como aquí y además le sobreescriba con un formato de fecha concreto, para poder convertirlo a DateTime, por ejemplo.
Para el que quiera usarlo, recordar que hay que hacer referencia al espacio de nombres Text.RegularExpressions.

miércoles, 2 de diciembre de 2009

Con un poco de estilo

Un aspecto que aunque no lo parezca es importante a la hora de programar aplicaciones es el estilo. Aunque los comentarios y todas esas cosas se suelen dejar para el final, no debería ser así por dos motivos:
Si hay que andar modificando código es más difícil encontrarlo y saber que hace cada cosa.
Al final, por mucho que digamos, "pasamos" de estar comentando y retocando el código.
Por eso he considerado importante documentarme un poco sobre el código antes de escribir una línea del mismo. Aquí van, a modo de resumen o que he considerado más importante:
1. Nombres de clases, métodos, objetos ...
  • Escribir los nombres de forma que se sepa que hacen. Por ejemplo, si queremos hacer un método que calcule un área, será siempre mejor  llamarle CalcularArea() que no Calcular o Area a secas.
  • Seguir una notación concreta. Yo he optado por usar una notación Pascal, que entre otras cosas consiste en poner en mayúscula las primera letra de cada palabra. Por ejemplo, podemos escribir un método de varias formas: CalcularArea(), calcular_area(), calculararea(). Cada uno es libre de escoger la que quiera, lo que si aconsejo es si escoges una, seguir siempre con esa. ¿Por qué? Pues más que nada por sencillez. Si declaro un método llamado CalcularArea() y otro calcular_superficie() cuando quiera definirlos o llamarlos no me acordare si después de Calcular iba Area o _area o que iba.
  • Aplicar la misma notación a todos los objetos, nombres… Por ejemplo, si creo un objeto DataTable, sería lógico que se llamase dtClientes, por ejemplo o si creo un objeto de tipo TextBox, podría llamarse txtEliminar. Otra opción es poner “obj” delante, o incluso o (oDataTable). Otra vez lo mismo, decidas lo que decidas, seguir siempre la misma notación.
2. Orden en el código.
  • Seguir un orden. En tu archivo de código usar siempre el mismo órden. El aconsejable y que tengo intención de usar yo es el siguiente:


    1. Instrucciones using
    2. Namespace que corresponda
    3. Clase: declaracion
    4. Variables o Campos
    5. Delegados y Eventos
    6. Propiedades
    7. Métodos, entre los que se incluye en constructor, los métodos públicos, los métodos protegidos y los métodos privados, en ese orden.



  • Usar las etiquetas de región #region y #endregion para separar cada parte, de forma que lo podamos contraer o expandir según nos interese.
3. Comentarios de líneas con // y /* */
  • Poner comentarios donde corresponda. No hace falta explicar al detalle todo, sino simplemente describir un poco lo que hace o aclarar cosas, sobre todo en partes de código que parezcan más confusas.
  • Poner los comentarios antes de lo que se quiere comentar y en una línea nueva, salvo en casos de pequeños comentarios, que se pueden poner seguido.
4. Comentarios XML
En Visual Studio es posible comentar las clases, métodos, campos, etc. mediante etiquetas XML. Aunque en principio puede parecer menos útil que los comentarios //, tiene algunas ventajas, como por ejemplo:
  • Permite generar un archivo XML de documentación del código que hemos programado. Otro día si me acuerdo explicaré como.
  • Nos permite conocer qué hacen las clases y métodos, qué parámetros reciben, que valores devuelven,etc.
Estos comentarios se añaden poniendo ///, tras lo cual el propio Visual añade la estructura del comentario. A continuación un ejemplo y su utilidad:
///<summary>
/// Descripcion breve de que hace el metodo PermitirAcceso
///</summary>
///<remarks>
/// Descripcion detallada (este es opcional)
///</remarks>
///<param name="Edad">Edad de la persona que quiere acceder</param>
///<returns>Devuelve true si la persona es mayor de 18 </returns>
public bool PermitirAcceso(int Edad)
{
     if (Edad => 18)
     {
          return true;
     }
     else
     {
          return false;
     }
}

Si ahora queremos llamar a esta función desde cualquier otro sitio, al empezar a introducir su nombre nos aparece la descripción breve del método:
image
Y si seguimos escribiendo, al abrir el paréntesis nos muestra una ayuda con los parámetros que tenemos que pasar y su descripción.
image
Podemos definir los parámetros que queramos e incluso sobrecargas si ponemos las etiquetas correspondientes antes de cada método. En el caso de sobrecargas, los campos de summary y returns han de coincidir en todos los métodos.

viernes, 27 de noviembre de 2009

Tareas Programadas

Alguna vez no os ha ocurrido en Windows XP que queréis programar una tarea que se ejecute a cierta hora o ciertos días? Para eso está el programador de tareas, que te permite mediante un asistente definir la tarea, la frecuencia,etc. Lo configuramos, y listo para ejecutar. Sin embargo llega la hora en que no tenía que ejecutarse pero no lo hace, ni avisa de que no lo ha echo, ni dice porque… en fin, un misterio.

jueves, 26 de noviembre de 2009

Comenzamos…

Esta es mi primera entrada en este blog y en los blogs en general, así que se puede decir que soy un primerizo en cuanto a blogs se refiere.
Llevo un tiempecillo documentándome sobre el lenguaje de programación C# o CSharp, y no por aburrimiento sino por la necesidad de realizar una aplicación en dicho lenguaje. Ayer mismo entré a través de Google en un blog (no recuerdo cual era) buscando información sobre programación en capas, y me llamó la atención la presentación del blogger (o bloggero o como se escriba) en la que decía algo así como que escribía el blog para poner de una forma ordenada todas las ideas que se le iban ocurriendo, códigos y ayudas que encontraba, de forma que tuviese una forma facil de acceder a ellas en caso de necesitarlas y a la vez compartirlas. Bueno pues esa es mi idea.
Lo primero que he intentado no es poner bonito el blog sino simplemente buscar dos características que me interesan:


  1. Poder expandir y contraer los códigos o comentarios que vaya implementando, lo cual conseguí gracias al blog de Rosa





  2. Poder colorear el texto, ya que no se puede pegar código directamente de Word, para lo cual nuevamente gracias a mi amigo Google encontré el blog de Yosel, en el que explica una forma de hacerlo a través de Writer y la extensión Code Snippet.


Al final, la forma de “colorear” no es exactamente lo que yo quería porque no lo expresa exáctamente como el editor de VS2008, que es el que uso, pero se le asemeja. A continuación pongo un pequeño ejemplo con la diferencia:
Código generado por Code Snippet:
string sql = @"SELECT * FROM Contacto";


List<ContactoEntity> list = new List<ContactoEntity>();


Código de VS2008:

string sql = @"SELECT * FROM Contacto";


List<ContactoEntity> list = new List<ContactoEntity>();

La diferencia es obvia, ya que el VS “colorea” de un color diferente las clases, tales como List o ContactoEntity, lo cual sirve de ayuda a la hora de distinguir clases de métodos.


Bueno, al final, con Post2Blog, resulta que si se puede copiar texto de Word. Se le aplica Clean MS Word HTML, en Tools y listo, debería funcionar.