Использование хранимых процедур является одним из способов и широко используется в течение многих лет.
Более современный способ взаимодействия с базами данных SQL Server из C # (или любого языка .NET) заключается в использовании Entity Framework. Преимущество Entity Framework заключается в том, что он обеспечивает более высокий уровень абстракции.
Чтобы цитировать от Microsoft ( https://msdn.microsoft.com/en-us/data/jj590134 ):
Платформа ADO.NET Entity Framework позволяет разработчикам создавать приложения для доступа к данным путем программирования на основе концептуальной модели приложения вместо программирования непосредственно на основе схемы реляционного хранения. Цель состоит в том, чтобы уменьшить объем кода и обслуживания, необходимых для приложений, ориентированных на данные. Приложения Entity Framework предоставляют следующие преимущества:
- Приложения могут работать с точки зрения более ориентированной на приложения концептуальной модели, включая типы с наследованием, сложные элементы и отношения.
- Приложения освобождаются от жестко закодированных зависимостей от конкретного механизма обработки данных или схемы хранения.
- Сопоставления между концептуальной моделью и схемой хранилища могут изменяться без изменения кода приложения.
- Разработчики могут работать с согласованной объектной моделью приложения, которая может быть сопоставлена с различными схемами хранения, возможно, реализованными в разных системах управления базами данных.
- Несколько концептуальных моделей могут быть сопоставлены с одной схемой хранения.
- Поддержка встроенных в язык запросов (LINQ) обеспечивает проверку синтаксиса во время компиляции для запросов по концептуальной модели.
Использование ORM против хранимых процедур требует компромиссов, особенно с точки зрения безопасности и того, где находится логика.
«Классический» подход к разработке с использованием SQL Server заключается в размещении логики приложения в хранимых процедурах и программах, которым предоставляются только права безопасности для выполнения хранимых процедур, а не непосредственное обновление таблиц. Концепция здесь заключается в том, что хранимые процедуры являются уровнем бизнес-логики для приложений. Несмотря на то, что теория обоснована, она, как правило, теряет популярность по разным причинам и заменяется реализацией бизнес-логики на языке программирования, таком как C # или VB. Хорошие приложения все еще реализуются с многоуровневым подходом, включая разделение интересов и т. Д., Но с большей вероятностью будут следовать шаблону, подобному MVC.
Недостатком реализации логики в ORM, а не в базе данных, является простота отладки и тестирования правил целостности данных лицами, ответственными за базу данных (DA или DBA). Возьмите классический пример перевода денег с вашего чека на сберегательный счет, важно, чтобы это было сделано как элементарная единица работы, другими словами, зажатая в транзакции. Если этот вид передачи разрешается выполнять только с помощью хранимой процедуры, то DA и аудиторы относительно легко проверяют хранимую процедуру.
Если, с другой стороны, это делается с помощью ORM, такого как Entity Framework, и в процессе работы обнаруживается, что в редких случаях деньги берут с проверки, но не вкладывают в сбережения, отладка может быть гораздо более сложной, особенно если потенциально задействовано несколько программ. Скорее всего, это будет крайний случай, возможно, связанный со специфическими аппаратными проблемами, которые должны возникать в определенной последовательности и т. Д. Как это проверить?