martes, 5 de enero de 2016

Basic Transation ADO.NET

using System;
using System.Configuration;
using System.Data.SqlClient;
using System.Diagnostics;

namespace ERMX.TE.CFDIValidation.Data
{  /// <summary>
  /// Representa clase base para acceso a datos
  /// </summary>
  public abstract class BaseDataAccess: IDisposable
  {    private readonly Enterprise.USA.Monitor.Tools.EventLogWriter.EventWriter eventWriter =
      new Enterprise.USA.Monitor.Tools.EventLogWriter.EventWriter();
   
    /// <summary>
    /// Objeto de conexión de base de datos.
    /// </summary>
    private SqlConnection connection;

    /// <summary>
    /// Cadena de conexión a la base de datos
    /// </summary>
    public string StringConnection { get; internal set; }

    /// <summary>
    /// Objeto de transacción con la transacción actual/activa
    /// </summary>
    internal SqlTransaction ActiveTransaction { get; set; }

    /// <summary>
    /// Instancia un acceso a datos
    /// </summary>
    public BaseDataAccess()
    {      this.StringConnection =
        ConfigurationManager.ConnectionStrings["ConnectionStringTE"].ConnectionString;
    }     protected bool Connect()
    {      bool bolResult = false;

      if (this.connection != null &&
          this.connection.State == System.Data.ConnectionState.Open)
        return true;

      try
      {        if (this.connection == null)
        {          this.connection = new SqlConnection();
          this.connection.ConnectionString = this.StringConnection;
        }
        this.connection.Open();
        bolResult = true;

      }
      catch (SqlException ex)
      {        bolResult = false;
        eventWriter.WriteEvent(ex.HResult, EventLogEntryType.Error, ex.Message);
      }
 
      return bolResult;


    }     /// <summary>
    /// Método para crear un comando
    /// </summary>
    /// <returns></returns>
    protected SqlCommand CreateCommand()
    {      SqlCommand command = this.connection.CreateCommand();

      if (this.ActiveTransaction != null)
      {        command.Transaction = this.ActiveTransaction;
      }
      return command;

    }

    /// <summary>
    /// Inicia una transacción en base a la conexion abierta.
    /// Lo que se ejecute luego de esta invocación estará
    /// dentro de una transacción.
    /// </summary>
    /// <returns>El estado de la trasancción</returns>
    public TransactionState CreateTransaction()
    {
      TransactionState result = TransactionState.TransactionExists;

      if (this.ActiveTransaction == null)
      {
        result = TransactionState.Error;
        if (this.connection == null ||

            this.connection.State != System.Data.ConnectionState.Open)
        {       
          if (!this.Connect())
            return result;

        } 
        this.ActiveTransaction = this.connection.BeginTransaction();
        result = TransactionState.Succes;

      }
 
      return result;


    }

    /// <summary>
    /// Metodo para confirmar una transacción
    /// </summary>
    public void Commit()
    {
      ActiveTransaction.Commit();
    }
    /// <summary>

    /// Método para deshacer una transacción
    /// </summary>
    public void Rollback()
    {
      ActiveTransaction.Rollback();
    }
 
    /// <summary>

    /// Método para abrir la conexión a base de datos
    /// </summary>
    protected void Open()
    {      this.connection.Open();
    }     /// <summary>
    /// Coloca las llamadas Dispose(true)
    /// </summary>
    public void Dispose()
    {          Dispose(disposing: true);
      GC.SuppressFinalize(this);
    }     /// <summary>
    /// Realiza limpieza de código y se lleva a cabo en Dispose (bool)
    /// </summary>
    /// <param name="disposing"></param>
    public virtual void Dispose(bool disposing)
    {      if (disposing)
      {        if (this.connection != null)
        {          if (this.ActiveTransaction != null)
          {            this.ActiveTransaction.Dispose();
          }           this.connection.Close();
          this.connection.Dispose();

        }
      }
    }
   }
  /// <summary>
  /// Estado de la transaccion.
  /// TransactionExists (2) -> Ya existe una transacción iniciada.
  /// Succes (1) -> La transaccion se inicio correctamente.
  /// Error (0) -> No existe una transacción
  /// </summary>
  public enum TransactionState
  {
    Error = 0,
    Succes = 1,
    TransactionExists = 2

   }

}