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

Почему бы не DbConnection вместо SqlConnection или OracleConnection?

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

Теперь, если вы не знаете, какой тип он есть, тогда вы будете использовать обобщенную/обобщенную форму ссылки, чтобы вы могли достичь своей цели, не беспокоясь о типе базы данных. Другой способ - написать кучу условных операторов для проверки типа базы данных, а затем выполнить операции в соответствии с ней.

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

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

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

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

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