Почему не DbConnection вместо SqlConnection или OracleConnection? - PullRequest
12 голосов
/ 12 марта 2011

Я перечитал Java, довольно новый для C #.Я надеюсь избежать неприятностей, когда в ближайшие несколько недель я проверю кучу кода DML.

Я привык к идее использования абстрактных классов JDBC, таких как Connection, Statement и т. П.,C # предлагает похожие абстрактные классы, такие как DbConnection, DbCommand и т. Д., В пространстве имен System.Data.Common.

Но большинство примеров, которые я видел, - как в документации MS, так и в других книгах -используйте конкретные классы: SqlConnection, OracleCommand и т. д. Этот вид конкретности даже показан в документации mySQL.

Каков наилучший опыт в этой области?Есть ли веская причина выбирать для этой цели конкретные таблицы-серверные, а не абстрактные классы?(Конечно, я знаю об опасностях понижения абстрактного на конкретное).

Ответы [ 3 ]

13 голосов
/ 12 марта 2011

Абстрактные классы не были частью первых версий фреймворка, они были представлены в версии 2.0.До этого было написано много примеров, или они основаны на примерах, которые были написаны до этого.

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

8 голосов
/ 12 марта 2011

Большинство специфичных для базы данных классов ADO.NET имеют дополнительные перегрузки и / или методы и свойства, специфичные для этого драйвера базы данных.

Использование конкретных классов, таких как SqlConnection и OracleConnection, облегчает доступ к специфичным для драйвера функциям.

4 голосов
/ 27 июня 2011

Как правило, когда вы знаете, какую базу данных использует ваша компания или вы, вы нацеливаетесь на этот конкретный тип базы данных.Если вы знаете его Oracle, то вы используете связанные с ним классы Oracle, если это SQLClient, тогда вы используете SqlClient и т. Д.

Теперь, если вы не уверены, какой это тип, то вы бы пошли наобщая / обобщенная форма ссылки, так что вы можете достичь своей цели, не беспокоясь о типе базы данных.Иначе, можно написать несколько условных операторов для проверки типа базы данных, а затем выполнить операции в соответствии с ней.

Обычный сценарий, который поможет вам понять, будет следующим: если вы пишете код,что ваш конечный пользователь может изменить файл конфигурации и ввести строку подключения для подключения к базе данных, что вы бы использовали?Это место, где DbFactory и его соответствующие классы пригодятся, где вместо написания кусков кода вы используете универсальный класс (вроде бы), чтобы справиться со всем.

Имейте в виду, что если вы делаете targetконкретного поставщика, у вас будет лучшая производительность (так как DbFactory должен разрешить вашего поставщика внутренне перед его обработкой), но если вы не уверены в поставщике конечного пользователя, тогда ваш код будет большим, а не эффективным.

Переходя к вашему другому вопросу: абстрактное или конкретное.Это до вас и снова, его сценарий.Преимущество abstract состоит в том, что вы можете FORCE / TIE настроить клиента на соответствие правилам (например, интерфейсу), а также обобщать вещи, а также использовать приведение типов (аналогично конкретным классам) для доступа к методам подкласса, чтобы что-то делать (проверьтепо этой теме, если можете. Используя полиморфизм времени выполнения, вы можете использовать один объект и вызывать метод, который имеет разные реализации в разных классах, подклассов к этому родительскому классу, о которых вам никогда не нужно беспокоиться - например, вычисление процентовможет быть, простые проценты и сложные проценты для банка, которые рассчитываются соответствующим классом, но вас это не волнует, так как вы просто говорите - GetInterest () и boom!).

Клубя оба вместе, я быскажем, в сценарии, когда вы не знаете тип базы данных, используемой конечным пользователем, и не зная строку подключения, вы можете заставить конечного пользователя реализовать ваш класс, ОСУЩЕСТВЛЯТЬ свой абстрактный метод для инициализации строки подключения итогда пеВыполните необходимую операцию, чтобы выдать вывод.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...