Conexión a database dependiendo del proveedor

Posted on 23 of julio, 2015 by admin in C# & VB.net

A manera introductoria a veces cuando desarrollamos aplicaciones las cuales necesitan conectarse a diferentes proveedores o base de datos como SQL Server, Oracle, Access, MySql, etc. No vemos en el dilema de tener que desarrollar una clase para las diferentes conexiones. Investigando en internet encontré que el framework desde sus inicios trae clases especializadas para estos fines una de ellas es la clase DbProviderFactory esta se encuentra el namespace System.Data.Common.

  1. Implementación

Vea a continuación como desarrollar una clase que nos permitirá utilizar cualquier tipo de proveedor. Creamos una clase a la mi clase le llamare DbHelper.

 


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

 
namespace com.jprograming
{
    public class DbHelper
    {
 

 
    }
}

Ahora agregamos los using que necesitamos:


using System.Data;
using System.Data.Common;
using System.Data.Odbc;
using System.Data.OleDb;
using System.Data.SqlClient;


Ahora tendremos lo siguiente


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.Common;
using System.Data.Odbc;
using System.Data.OleDb;
using System.Data.SqlClient;

 
namespace com.jprograming
{
    public class DbHelper
    {
 

 
    }
}


Ahora luego de adicionar los using declararemos algunas variables e implementaremos el patrón sigleton porque queremos que solo haya una instancia de esta clase.


#region FIELDS
       private static DbHelper oInstance = null;
 
       private DbProviderFactory oFactory;
       private DbCommand oCommand;
       private DbConnection oConnection;        
       private string oConnectionString;
       private string oTypeName;
 
#endregion

Ahora tendremos lo siguiente:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.Common;
using System.Data.Odbc;
using System.Data.OleDb;
using System.Data.SqlClient;

 
namespace com.jprograming
{
    public class DbHelper
    {
  	#region FIELDS
       private static DbHelper oInstance = null;
 
       private DbProviderFactory oFactory;
       private DbCommand oCommand;
       private DbConnection oConnection;        
       private string oConnectionString;
       private string oTypeName;
 
	#endregion
 
    }
}


Ahora declaramos el constructor vacío como privado e implementamos el sigleton:


#region CONSTRUCTOR 
 	private DbHelper() { } 
 #endregion

 #region SINGLETON 
       public static DbHelper getDbHelper()
       {
           if (oInstance == null)
           {
               oInstance = new DbHelper();
           }
           return oInstance;
       } 
#endregion

Ahora tendermos lo siguiente:


using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.Common;
using System.Data.Odbc;
using System.Data.OleDb;
using System.Data.SqlClient;

 
namespace com.jprograming
{
    public class DbHelper
    {
  	#region FIELDS
       private static DbHelper oInstance = null;
 
       private DbProviderFactory oFactory;
       private DbCommand oCommand;
       private DbConnection oConnection;        
       private string oConnectionString;
       private string oTypeName;
 
	#endregion
	
	#region CONSTRUCTOR
 
 		private DbHelper() { }
 
 	#endregion

	 #region SINGLETON
 
       public static DbHelper getDbHelper()
       {
           if (oInstance == null)
           {
               oInstance = new DbHelper();
           }
           return oInstance;
       }
 
	#endregion
 
    }
}


Ahora creamos los métodos que nos ayudar a realizar el proceso el primero será el método donde pasamos como parámetro la conexión y el proveedor y los métodos que utilizaremos para ejecutar los query o los storeprocedure:


    #region PROCEDURE
 
    public void setProviderAndConnectionString(string ConnectionString, string Provider)
    {
        oFactory = DbProviderFactories.GetFactory(Provider);
        oConnectionString = ConnectionString;
 
    }
 
    private void setConnection()
    {
        oConnection = oFactory.CreateConnection();
        oTypeName = oConnection.GetType().FullName;
 
        switch (oTypeName)
        {
 
            case "System.Data.SqlClient.SqlConnection":
                {
                    oConnection = new SqlConnection(oConnectionString);
                    break;
                }
            case "System.Data.OleDb.OleDbConnection":
                {
                    oConnection = new OleDbConnection(oConnectionString);
                    break;
                }
            case "System.Data.Odbc.OdbcConnection":
                {
                    oConnection = new OdbcConnection(oConnectionString);
                    break;
                }
            default:
                {
                    oConnection = new SqlConnection(oConnectionString);
                    break;
                }
        }
 
    }
 
    //
    public int ExecuteNoQuery(string CommandText)
    {
        int rs = 0;
        try
        {
            setConnection();
 
            if (oConnection.State != ConnectionState.Open)
            {
                oConnection.Open();
            }
 
            oCommand = oConnection.CreateCommand();
            oCommand.CommandType = CommandType.Text;
            oCommand.CommandText = CommandText;
            rs = oCommand.ExecuteNonQuery();
 
        }
        catch (Exception ex)
        {
 
            throw new Exception(ex.Message);
        }
        finally
        {
            oCommand.Connection.Close();
        }
 
        return rs;
    }
 
    //
    public int ExecuteStoreProcedure(string StoreProcedureName)
    {
 
        int rs = 0;
        try
        {
            setConnection();
 
            if (oConnection.State != ConnectionState.Open)
            {
                oConnection.Open();
            }
 
            oCommand = oConnection.CreateCommand();
            oCommand.CommandType = CommandType.Text;
            oCommand.CommandText = StoreProcedureName;
            rs = oCommand.ExecuteNonQuery();
 
        }
        catch (Exception ex)
        {
 
            throw new Exception(ex.Message);
        }
        finally
        {
            oCommand.Connection.Close();
        }
 
        return rs;
    }
 
        #endregion


Al final tendremos lo siguiente:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.Common;
using System.Data.Odbc;
using System.Data.OleDb;
using System.Data.SqlClient;
 
 
namespace com.jprograming
{
    public class DbHelper
    {
 
        #region FIELDS
        private static DbHelper oInstance = null;
 
        private DbProviderFactory oFactory;
        private DbCommand oCommand;
        private DbConnection oConnection;        
        private string oConnectionString;
        private string oTypeName;
 
        #endregion
 
        #region CONSTRUCTOR
 
        private DbHelper() { }
 
        #endregion
 
        #region SINGLETON
 
        public static DbHelper getDbHelper()
        {
            if (oInstance == null)
            {
                oInstance = new DbHelper();
            }
            return oInstance;
        }
 
        #endregion
 
        #region PROCEDURE
 
        public void setProviderAndConnectionString(string ConnectionString, string Provider)
        {
            oFactory = DbProviderFactories.GetFactory(Provider);
            oConnectionString = ConnectionString;
 
        }
 
        private void setConnection()
        {
            oConnection = oFactory.CreateConnection();
            oTypeName = oConnection.GetType().FullName;
 
            switch (oTypeName)
            {
 
                case "System.Data.SqlClient.SqlConnection":
                    {
                        oConnection = new SqlConnection(oConnectionString);
                        break;
                    }
                case "System.Data.OleDb.OleDbConnection":
                    {
                        oConnection = new OleDbConnection(oConnectionString);
                        break;
                    }
                case "System.Data.Odbc.OdbcConnection":
                    {
                        oConnection = new OdbcConnection(oConnectionString);
                        break;
                    }
                default:
                    {
                        oConnection = new SqlConnection(oConnectionString);
                        break;
                    }
            }
 
        }
 
        //
        public int ExecuteNoQuery(string CommandText)
        {
            int rs = 0;
            try
            {
                setConnection();
 
                if (oConnection.State != ConnectionState.Open)
                {
                    oConnection.Open();
                }
 
                oCommand = oConnection.CreateCommand();
                oCommand.CommandType = CommandType.Text;
                oCommand.CommandText = CommandText;
                rs = oCommand.ExecuteNonQuery();
 
            }
            catch (Exception ex)
            {
 
                throw new Exception(ex.Message);
            }
            finally
            {
                oCommand.Connection.Close();
            }
 
            return rs;
        }
 
        //
        public int ExecuteStoreProcedure(string StoreProcedureName)
        {
 
            int rs = 0;
            try
            {
                setConnection();
 
                if (oConnection.State != ConnectionState.Open)
                {
                    oConnection.Open();
                }
 
                oCommand = oConnection.CreateCommand();
                oCommand.CommandType = CommandType.Text;
                oCommand.CommandText = StoreProcedureName;
                rs = oCommand.ExecuteNonQuery();
 
            }
            catch (Exception ex)
            {
 
                throw new Exception(ex.Message);
            }
            finally
            {
                oCommand.Connection.Close();
            }
 
            return rs;
        }
 
        #endregion
 
 
    }
}


Por razones de tiempo no construiré la case completa solo implantaremos dos métodos para no ser muy cansón en este post. Creamos una appwindos para probar lo que creamos como la imagen siguiente.


En el método click del botón pondremos lo siguiente:
private void btnRobot2_Click(object sender, EventArgs e)
{
          int rs = 0;
          DbHelper.getDbHelper().setProviderAndConnectionString(@"data source=STLX-DEV05\SQL2012A,28325;initial catalog=Dev_Global_loaddata;persist security info=True;user id=Developer05;password=Developer05;MultipleActiveResultSets=True;", "System.Data.SqlClient");
          rs = DbHelper.getDbHelper().ExecuteNoQuery("select top 1 * from reportes.AGENTES");
 
          this.textBox1.Text = (rs == -1) ? "Se ejecuto correctamente 1\n" : "No se ejecuto";
          
          DbHelper.getDbHelper().ExecuteNoQuery("select top 10 * from reportes.AGENTES");
 
          this.textBox1.Text += (rs == -1) ? "Se ejecuto correctamente 2" : "No se ejecuto";
 
}


Espero que este ejemplo sirva para ayudar a quien lo necesite si alguien lee el post y tiene alguna duda me escribe un mail y le responderé lo más pronto posible.

Descargar Ejemplo