ID: 13001 - Múltiples proveedores de datos en una clase única usando DbFactory
Posted by layonman98 on Thu Apr 08 20:52:31 UTC 2010. Language csharp

/* Enumeración y clase que permite realizar conexiones a distintos motores de bases de datos
 * haciendo uso de distintos drivers intercalables en tiempo de ejecución y sin necesidad
 * de recompilación.
 * Las referencias ya deben están agregadas al proyecto, y las Connection Strings son
 * obtenidas desde el archivo app.config
 */
using System;
using System.Configuration;
using System.Data;
using System.Data.Common;

public enum DbProvider
{
  MySql,  // MySQL
  Npgsql, // PostgreSQL
  OleDb   // Access
}
public class GenericDAO
{
  static string connectionString;

  private static DbProviderFactory GetProvider( DbProvider provider )
  {
    DbProviderFactory db = null;
    switch( dbProvider )
    {
      case DbProvider.OleDb:
        db = System.Data.OleDb.OleDbFactory.Instance;
        connectionString = ConfigurationManager.ConnectionStrings[ "Access" ].ConnectionString;
        break;
      case DbProvider.Npgsql:
        db = Npgsql.NpgsqlFactory.Instance;
        connectionString = ConfigurationManager.ConnectionStrings["PostgreSQL"].ConnectionString;
        break;
      case DbProvider.MySql:
        db = MySql.Data.MySqlClient.MySqlClientFactory.Instance;
        connectionString = ConfigurationManager.ConnectionStrings["MySql"].ConnectionString;
        break;
    }
    return db;
  }

  /* Ejemplo de implementación de esta clase.
   * Este método, recibe por parámetro la consulta que se desea hacer a la base de datos
   * y el driver que se desea implementar.
   * Los parámetros de conexión como el host del database engine, usuario, contraseña
   * y base de datos a la que se desea conectar, están especificados en el archivo de configuración
   * el cual no es cubierto en este snippet.
   */
  public static DataTable ExecuteQuery( string query, DbProvider provider )
  {
    var db = GetProvider( dbProvider );
    var connection 	= db.CreateConnection();
    var command 	= db.CreateCommand();
    var adapter		= db.CreateDataAdapter();
    var resultTable     = new DataTable();

    connection.ConnectionString = connectionString;
    command.Connection 			= connection;
    command.CommandType 		= System.Data.CommandType.Text;
    command.CommandText 		= query;
    adapter.SelectCommand 		= command;
    try {
      adapter.Fill( resultTable );
    } catch (Exception ex) {
      System.Diagnostics.Debug.WriteLine( ex.Message );
    } finally {
      if( connection.State == ConnectionState.Open )
        connection.Close();
    }
    return resultTable;
  }
}