¿Cuáles son las principales ventajas de cada uno de los métodos de conexión de base de datos anteriores en C# en términos de conexión a múltiples fuentes de datos posibles (siendo agnóstico de base de datos)? ¿También en términos de rendimiento que es probable que ofrezca el mejor rendimiento en todos los ámbitos?DbConnection vs OleDbConnection vs OdbcConnection
Finalmente, ¿hay alguna razón para evitar un método particular para una aplicación de base de datos independiente?
La razón por la que pregunto es porque mi aplicación actualmente utiliza Ole y tengo algunos problemas para conectarme a ciertas bases de datos usando fábricas y, como tal, estoy buscando alternativas. He oído que Odbc es más lento que Ole, pero ¿hay algo de verdad detrás de esto y es realmente notable en una aplicación real?
razón de mi interés en este tema es el siguiente:
Mis requisitos para mi estado actual proyecto que debo tener una capa de acceso de datos de trabajo que es capaz de conectarse a cualquier base de datos sin el conocimiento previo de dicha base de datos. Por lo tanto, no puedo codificar cualquier cosa específica para una base de datos dada en términos de conexión. La ejecución de enunciados específicos del dialecto en cada base de datos dada se ha tratado utilizando un concepto de tipo de fábrica de consultas sql. Lo mismo ocurre con la sustitución y el formato de las variables de vinculación.
ACTUALIZACIÓN: Tal como está, ahora tengo una versión funcional de mi código que utiliza ADO.net y las fábricas de proveedores de bases de datos. Esto significa que estoy usando las clases base como lo sugirió Adam Houldsworth. El proveedor se especifica en la cadena de conexión bajo el atributo providerName. La cadena de conexión se almacena en la aplicación.config, donde puede ser recuperada por mi clase de conexión de base de datos. Siempre que se haya instalado el controlador correcto, como npgsql o el paquete odac para Oracle, la fábrica funcionará correctamente. A continuación se muestra una muestra de mi código que muestra el constructor básico para un objeto de conexión que utiliza una fábrica de proveedores.
private readonly DbFactoryBindVariables m_bindVariables;
private readonly DbProviderFactory m_provider;
private string m_connectionString = String.Empty;
private readonly string m_providerName = String.Empty;
private DbConnection m_dbFactoryDatabaseConnection;
/// <summary>
/// Default constructor for DbFactoryDatabaseConnection.
/// </summary>
public DbProviderFactoryConnection()
{
m_providerName = ConfigurationManager.ConnectionStrings["ApplicationDefault"].ProviderName;
m_provider = DbProviderFactories.GetFactory(m_providerName);
m_dbFactoryDatabaseConnection = m_provider.CreateConnection();
m_connectionString = ConfigurationManager.ConnectionStrings["ApplicationDefault"].ConnectionString;
m_dbFactoryDatabaseConnection.ConnectionString = m_connectionString;
m_bindVariables = new DbFactoryBindVariables(m_dialect.ToLower(), DbFactoryBindSyntaxLoader.Load(this));
}
puede ser necesario añadir algo similar a lo siguiente en el app.config o web.config si no está ya presente en el machine.config para su versión de .NET Framework elegido.
<system.data>
<DbProviderFactories>
<add name="Npgsql Data Provider"
invariant="Npgsql"
support="FF"
description=".Net Framework Data Provider for Postgresql Server"
type="Npgsql.NpgsqlFactory, Npgsql, Version=2.0.1.0, Culture=neutral,
PublicKeyToken=5d8b90d52f46fda7" />
</DbProviderFactories>
</system.data>
Cadena de conexión requerido:
<add name="ApplicationDefault" connectionString="DATA SOURCE=TNSNAME;PASSWORD=PASS;USER ID=USER;" providerName="Oracle.DataAccess.Client;"/>
En esta etapa que ahora puede ser totalmente agnóstico base de datos siempre que la cadena de conexión correcta se utiliza para configurar la versión de los clientes de la aplicación.
Agregó una actualización para los interesados. – CSharpened