Подтвердить что ты не робот

DbConnection vs OleDbConnection vs OdbcConnection

Каковы основные преимущества каждого из вышеперечисленных методов подключения к базе данных на С# в плане подключения к нескольким возможным источникам данных (агностик базы данных)? Также с точки зрения производительности, которая может обеспечить наилучшую производительность по всем направлениям?

Наконец, есть ли причины, по которым вы бы избегали конкретного метода для агностического приложения базы данных?

Причина, по которой я спрашиваю, заключается в том, что мое приложение в настоящее время использует 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;"/>

На этом этапе я могу теперь полностью агрегировать базу данных, если правильная строка соединения используется при настройке клиентской версии приложения.

4b9b3361

Ответ 1

Я бы не хотел абстрагировать соединение с базой данных, поскольку вы всегда нацелены на самый низкий общий знаменатель. Вместо этого попытайтесь отвлечься от необходимости сохранения объектов. Каждая реализация этой абстракции может быть специфичной для базы данных (в основном, программирования против интерфейсов).

Тем не менее, я ни разу не испытал случай, когда необходимость поддержки нескольких баз данных была жестким требованием. В этом случае все это усугубляется в мантру Ягни.

Вопрос о сравнении OLE DB с ODBC обычно можно найти здесь:

В чем разница между OLE DB и источниками данных ODBC?

Несмотря на то, что вопрос с вопросами об эффективности - это хорошо, вопрос не может быть дан в контексте вашего приложения. К сожалению, только профилирование обоих образцов данных образца даст вам ответы, которые вам нужны.

В DbConnection не так много примечания, это базовый класс для других классов соединения с базой данных.

Рассматривали ли вы ORM, например NHibernate или фреймворк, например блок приложений доступа к данным Enterprise Library? Это поможет вам абстрагировать базу данных (с ORM, до того момента, когда вам вообще не нужно делать какие-либо кодировки в базе данных).

Обновление:, насколько я могу судить по комментариям, кажется, что ваш единственный вариант - использовать базовые классы .NET(например, DbConnection) или интерфейсы (IDbConnection). Насколько я знаю, нет ничего, что могло бы дать вам правильное соединение для строки подключения, поэтому вам может понадобиться закодировать эту часть. Таким образом, вы можете вернуть OleDbConnection, OdbcConnection, SqlConnection и т.д. При обнаружении строки подключения, но использовать их в коде как DbConnection или IDbConnection, тем самым сохраняя агностик вашего базового базиса.

Не идеален, но отлично работает.

Ответ 2

Использование DbProviderFactory - хороший выбор, если вам нужен уровень доступа к агностическим данным, без кодирования доступа к данным более одного раза.

Я не вижу причин, по которым вы хотите его избежать, и все необходимые функции покрываются с использованием базовых классов на System.Data.Common.

Мы используем доступ к агностическим данным на Nearforums, потому что мы поставляем сценарии SQL Server и MySql db, О производительности, это зависит от конкретных решений (Oracle, MySql, PostgreSQL,...), предоставляемых различными компаниями/сообществами. Большинство известных разъемов были проверены надлежащим образом в течение нескольких лет.