Приложение C # - Должен ли я использовать хранимые процедуры или ADO.NET с методами программирования C #? - PullRequest
5 голосов
/ 19 января 2009

У меня есть приложение на C #, которое я создаю и которое хранит все данные в SQL Server.

Иногда мне проще программно вносить изменения в данные, а иногда проще иметь хранимые процедуры и функции в базе данных SQL Server и вызывать их.

Я довольно новичок в программировании, и я не знаю, каковы тонкие преимущества и / или недостатки каждого метода.

Я полагаю, что, вероятно, я должен делать вещи так или иначе, а не использовать несколько методов.

Мой код начинает выглядеть как случайный набор мыслей, которые просто спрятаны в одном месте. Не обижайся на Джоэла Спольски. Я люблю его книги.

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

Спасибо

J3r3myK

Ответы [ 5 ]

9 голосов
/ 19 января 2009

Ну, Stored Procs может быть дополнительным уровнем абстракции или набором функций / методов, если вы смотрите на базу данных как объект или службу. Это может быть выгодно, поскольку вы можете скрыть основные детали реализации и изменить их, когда это необходимо, без прерывания работы приложения (пока вы покидаете интерфейс, например, сохраненные параметры процедуры, в одиночку). Кроме того, если вы можете скрыть детали таблицы за набором хранимых процедур, независимо от того, как кто-то получит доступ к вашей базе данных, он сможет взаимодействовать с ней только с помощью методов, которые вы разработали и написали для нее -> меньше риск взлома Excel и взлома вашей базы данных.

С другой стороны, Stored Proc требует обширных знаний T-SQL, и вы будете распределять свою логику бизнеса и приложений по двум наборам кодов, что может быть недостатком. Все, что вы можете сделать в хранимой процедуре, также может быть выполнено в ADO.NET с прямыми операторами SQL, и это больше не замедляется.

Еще одним плюсом для Stored Procs является тот факт, что если что-то не так в вашем процессе, вы можете исправить это, просто развернув процесс с исправлением - вам не нужно прикасаться к приложению C #. Это может быть большим плюсом в «размещенной» среде, если вы получаете только 3 релиза в год - тогда исправление с помощью исправления Stored Proc может помочь вам в этом! : -)

В целом: есть много плюсов и минусов за или против хранимых проков; Я бы посоветовал, если вы чувствуете себя комфортно при написании T-SQL, почему бы не попробовать и посмотреть, как он работает для вас. Если он кажется громоздким, слишком негибким или слишком долгим в долгосрочной перспективе, вы всегда можете вернуться к использованию прямого SQL в своем приложении C #.

Только мои 0,02 доллара. Marc

6 голосов
/ 19 января 2009

Два пункта, которые еще не были рассмотрены:

SProcs могут быть размещены в схеме и олицетворять другую схему. Это означает, что вы можете заблокировать доступ к базе данных и дать пользователям разрешения ТОЛЬКО на выполнение SProcs, а не на выбор обновлений и т. Д., Что является очень хорошим бонусом безопасности.

Во-вторых, sproc может быть значительно быстрее в зависимости от того, какие операции вы выполняете. Если вы ограничены сетевым вводом-выводом и способны выполнять операции с множествами над своими данными, делая это в одной хранимой процедуре, а не извлекайте набор данных ENTIRE, обрабатывая его, а затем передавая изменение, вы получите значительное увеличение скорости. 1005 *

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

4 голосов
/ 19 января 2009

Что ж, вы в конечном итоге будете использовать ADO.NET в любом случае ... похоже, вы имеете в виду хранимые процедуры против командного текста. К сожалению, у обоих есть свои преимущества, так что это не простой вопрос, однако, если вы смотрите на такие инструменты, как LINQ, у командного текста есть больше преимуществ, поскольку он может быть более «компостируемым» (то есть вызывающий может добавить Skip / Take / Where / OrderBy и повлиять на общий запрос).

Другой вариант, который сочетает в себе преимущества обеих функций - это табличные функции (через UDF) - они также обладают преимуществом более сильных метаданных (трудно точно запросить схему хранимой процедуры).

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

3 голосов
/ 19 января 2009

Позвольте мне перефразировать это: если вы вытаскиваете данные, модифицируете их в коде, а затем , имея SP, обновите БД новыми значениями , или вам просто нужно вызвать SP как "функция".
Я хочу подчеркнуть, что даже если вы выполняете манипуляции с данными в коде, вы все равно должны обращаться только к SP на БД.

То, будете ли вы это делать или манипуляции с данными будут выполнять более сложные SP, будет зависеть от нескольких факторов:

  • ваш уровень комфорта со сложным SQL (в отличие от C #)
  • сколько данных вам нужно извлечь и изменить - могут быть аспекты производительности (стоит вытащить все эти данные в код)
  • при подключении к предыдущему ваша архитектура может вступить в игру - например, Вы обращаетесь к локальному серверу БД или к удаленному
  • Какие манипуляции вам нужно сделать, это может быть настолько сложным, что вы не хотите испачкать свой sql
  • Какую бизнес-логику нужно применять, от чего зависят данные и т. Д.

Это действительно сводится к суждению, нет правильного пути (хотя есть много неправильных путей ...). Хотя важно сохранять согласованность, вполне допустимо иметь различные типы доступа к БД в вашей системе, если это оправдано контекстом / потребностью.
Я бы сказал, выберите тот, который вам наиболее удобен, и придерживайтесь этого - , пока у вас не будет причины сделать это по-другому . Нет причин быть догматичным об этом ...

0 голосов
/ 19 января 2009

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

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