Каковы основные преимущества каждого из вышеперечисленных методов подключения к базе данных на С# в плане подключения к нескольким возможным источникам данных (агностик базы данных)? Также с точки зрения производительности, которая может обеспечить наилучшую производительность по всем направлениям?
Наконец, есть ли причины, по которым вы бы избегали конкретного метода для агностического приложения базы данных?
Причина, по которой я спрашиваю, заключается в том, что мое приложение в настоящее время использует Ole, и у меня возникает несколько проблем с подключением к определенным базам данных с использованием заводов, и поэтому я рассматриваю альтернативы. Я слышал, что Odbc медленнее, чем Ole, но есть ли какая-то правда в этом и действительно ли это заметно в реальном мире?
Причина моего интереса к этой теме заключается в следующем:
Мои требования для моего текущего проекта состоят в том, что у меня должен быть рабочий уровень доступа к данным, который способен подключаться к любой базе данных без предварительного знания указанной базы данных. Поэтому я не могу жестко кодировать что-либо конкретное для какой-либо конкретной базы данных с точки зрения соединения. Запуск конкретных операторов диалектов по каждой данной базе данных был рассмотрен с использованием концепции типа sql query factory. То же самое относится к подстановке и форматированию переменных привязки.
UPDATE: В настоящее время у меня теперь есть рабочая версия моего кода, который использует ADO.net и базы данных поставщиков. Это означает, что я использую базовые классы, как это предложил Адам Хилдсворт. Поставщик указан в строке подключения в атрибуте providerName. Строка соединения хранится в app.config, где ее можно получить по моему классу подключения к базе данных. Если установлен правильный драйвер, например npgsql или пакет odac для Oracle, то factory будет работать нормально. Ниже приведен пример моего кода, показывающий базовый конструктор для объекта соединения с использованием поставщика factory.
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));
}
Может потребоваться добавить что-то похожее на следующее в app.config или web.config, если оно еще не присутствует в файле machine.config для выбранной вами версии .net framework.
<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>
Требуется строка подключения:
<add name="ApplicationDefault" connectionString="DATA SOURCE=TNSNAME;PASSWORD=PASS;USER ID=USER;" providerName="Oracle.DataAccess.Client;"/>
На этом этапе я могу теперь полностью агрегировать базу данных, если правильная строка соединения используется при настройке клиентской версии приложения.