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;
}
}