Каков наилучший способ запроса данных с MS SQL Server в C #?
Я знаю, что это не очень хорошая практика - иметь SQL-запрос в коде.
Это лучший способ создать хранимую процедуру и вызвать ее из C # с параметрами?
using (var conn = new SqlConnection(connStr))
using (var command = new SqlCommand("StoredProc", conn) { CommandType = CommandType.StoredProcedure }) {
conn.Open();
command.ExecuteNonQuery();
conn.Close();
}
c#
sql
sql-server
Bruno
источник
источник
// SQLCODE
это сделать - но вы должны помнить, чтобы сделать это.Ответы:
Использование хранимых процедур является одним из способов и широко используется в течение многих лет.
Более современный способ взаимодействия с базами данных SQL Server из C # (или любого языка .NET) заключается в использовании Entity Framework. Преимущество Entity Framework заключается в том, что он обеспечивает более высокий уровень абстракции.
Чтобы цитировать от Microsoft ( https://msdn.microsoft.com/en-us/data/jj590134 ):
Платформа ADO.NET Entity Framework позволяет разработчикам создавать приложения для доступа к данным путем программирования на основе концептуальной модели приложения вместо программирования непосредственно на основе схемы реляционного хранения. Цель состоит в том, чтобы уменьшить объем кода и обслуживания, необходимых для приложений, ориентированных на данные. Приложения Entity Framework предоставляют следующие преимущества:
Использование ORM против хранимых процедур требует компромиссов, особенно с точки зрения безопасности и того, где находится логика.
«Классический» подход к разработке с использованием SQL Server заключается в размещении логики приложения в хранимых процедурах и программах, которым предоставляются только права безопасности для выполнения хранимых процедур, а не непосредственное обновление таблиц. Концепция здесь заключается в том, что хранимые процедуры являются уровнем бизнес-логики для приложений. Несмотря на то, что теория обоснована, она, как правило, теряет популярность по разным причинам и заменяется реализацией бизнес-логики на языке программирования, таком как C # или VB. Хорошие приложения все еще реализуются с многоуровневым подходом, включая разделение интересов и т. Д., Но с большей вероятностью будут следовать шаблону, подобному MVC.
Недостатком реализации логики в ORM, а не в базе данных, является простота отладки и тестирования правил целостности данных лицами, ответственными за базу данных (DA или DBA). Возьмите классический пример перевода денег с вашего чека на сберегательный счет, важно, чтобы это было сделано как элементарная единица работы, другими словами, зажатая в транзакции. Если этот вид передачи разрешается выполнять только с помощью хранимой процедуры, то DA и аудиторы относительно легко проверяют хранимую процедуру.
Если, с другой стороны, это делается с помощью ORM, такого как Entity Framework, и в процессе работы обнаруживается, что в редких случаях деньги берут с проверки, но не вкладывают в сбережения, отладка может быть гораздо более сложной, особенно если потенциально задействовано несколько программ. Скорее всего, это будет крайний случай, возможно, связанный со специфическими аппаратными проблемами, которые должны возникать в определенной последовательности и т. Д. Как это проверить?
источник
На самом деле, основное утверждение является дискуссионным - существуют компромиссы между наличием SQL в коде или кодом в базе данных (куда вы направляетесь с помощью хранимых процедур).
Результатом является то, что не существует единственного «лучшего», это не то, что вы можете обобщить, потому что какой бы путь вы ни пошли, вы идете на компромисс (вы получаете выгоды, но также вводите ограничения).
Если между вашим приложением и базой данных есть однозначное соответствие, это не имеет значения. Если, с другой стороны, у вас есть большая базовая база данных, совместно используемая значительным числом приложений, обеспечение согласованности в базе данных между этими приложениями становится гораздо более важным.
Что важнее, так это беспокоиться об архитектуре и уровне вашего приложения - при наличии соответствующего уровня доступа к данным, будь то использование ORM, такого как Entity Framework или NHibernate или выполнение чего-то более прямого, должно изолировать большую часть вашего приложения от этого решения, независимо от того, создаете ли вы запросы или использовать хранимые процедуры.
Я буду свободно работать над сравнительно небольшими проектами с небольшими командами (1-3 разработчика) - для меня использование хранимых процедур доставляет больше хлопот, чем их ценность, поскольку с учетом характера наших приложений (и моих навыков?) Развертывание новых Код, как правило, намного проще, чем обновление схемы (даже если у меня есть код, который делает обновление схемы относительно простым), и я могу применять бизнес-правила, используя общий код доступа к данным. Это явно классический пример «Ваш пробег может меняться».
источник
Пока вы параметризовали свои входные данные, любой подход действителен. Большая часть запросов в аргументах кода возникла в старые добрые времена, когда многие библиотеки заставляли вас добавлять строки в свои операторы вместе, и именно отсюда исходили SQL-инъекции.
источник
Здесь передовой опыт действительно преувеличен - есть много хороших способов сделать это, и тот, который вы выберете, должен зависеть от того, что ваше приложение и что вам нужно делать. Тем не менее, есть только две вещи, которые вы можете сделать действительно неправильно:
Как указывает @Bill, вы всегда должны параметризировать свои запросы. Построение строк - это простой вектор для внедрения SQL, а также всевозможные трудные для отслеживания ошибок. Гораздо умнее люди придумали, как обучать и избегать SQL, поэтому вам не нужно разбираться в этом самостоятельно.
Закройте ваши связи. Лучший способ - это обернуть все оператором использования, но попытка / ловить / наконец тоже хороша, если это плавает на вашей лодке. Но всегда убедитесь, что вы используете соединение, как дешевый автомобиль - управляйте им быстро и быстро и избавьтесь от него быстро.
Другой практикой, за которую я бы не согласился, является то, что вы должны сосредоточить свой код доступа к данным в как можно меньшем количестве мест. Мы не разрешаем интерфейсным веб-приложениям хранить прямую ссылку на System.Data.SqlClient, чтобы обеспечить соблюдение этого предостережения.
источник