Вызов хранимых процедур

У меня есть приложение C#, которое взаимодействует с базой данных только через хранимые процедуры. Я пробовал различные методы вызова хранимых процедур. В основе лежит класс SqlCommand, однако я хотел бы добиться нескольких вещей:

  • сделать интерфейс между C# и sql более плавным, чтобы вызовы процедур больше походили на вызовы функций C#
  • есть простой способ определить, вызывается ли данная хранимая процедура где-либо в коде.
  • сделать создание вызова процедуры быстрым и легким.

Я исследовал разные возможности. В одном из них у меня был проект, который своей структурой пространства имен отражал структуру имен хранимых процедур, таким образом, я мог сгенерировать имя хранимой процедуры из имени класса, и я мог определить, использовалась ли данная хранимая процедура. оштрафовав его в дереве пространства имен. Какие еще опыты?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
2 152
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Вам следует попробовать LINQ to SQL.

Ответ принят как подходящий

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

Я считаю ошибкой зеркалировать SP в вашем приложении, поскольку, как правило, ваша реляционная модель не совпадает с 1-1 объектной моделью предметной области приложения.

Например, обычно у меня нет объектов приложения, которые представляют таблицы ссылок или другие артефакты проектирования и нормализации базы данных. Это коллекции объектов, которые либо содержатся в других объектах, либо возвращаются ими.

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

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

eulerfx 03.10.2008 01:13

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

Cade Roux 03.10.2008 01:19

Вы изучали использование Корпоративная библиотека от MS? Это позволяет легко вызывать хранимые процедуры. Обычно я настраиваю класс для каждой базы данных, который предназначен только для вызова этих сохраненных процедур. Затем у вас может быть что-то похожее (извините, это vb.net, а не C#):

Public Shared Function GetOrg(ByVal OrgID As Integer) As System.Data.DataSet
    Return db.ExecuteDataSet("dbo.cp_GetOrg", OrgID)
End Function

Где db определяется как:

Dim db As Microsoft.Practices.EnterpriseLibrary.Data.Database = DatabaseFactory.CreateDatabase()

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

Самое простое решение для того, что вы хотите [и я не говорю, что это лучше или хуже, чем другие решения], - это создать набор данных и перетащить хранимые процедуры из обозревателя сервера на поверхность конструктора наборов данных. В адаптере будут созданы методы, которые можно вызывать и проверять на наличие ссылок.

При создании моего текущего продукта одним из инструментов, который я очень хотел реализовать, был класс базы данных (например, DatabaseFactory - только я не заботился об этом), который упростил бы мою разработку и удалил некоторые «подводные камни». Внутри этого класса я хотел иметь возможность вызывать хранимые процедуры как настоящие функции C#, используя сопоставление функций и sproc, например:

общедоступный int Call_MySproc (int paramOne, bool paramTwo, ref int outputParam)

{

... здесь обработка параметров и вызов sproc

}

Однако самая большая проблема, с которой вы сталкиваетесь при попытке сделать это, заключается в работе, необходимой для создания функций C#, реализующих вызовы sproc. К счастью, легко создать генератор кода для этого на T-SQL. Я начал с одного, изначально созданного Полом Маккензи, а затем модифицировал его различными способами, чтобы сгенерировать код C# так, как я хотел.

Вы можете либо Google Paul McKenzie, либо поискать его оригинальный генератор кода, либо, если вы хотите написать мне на mark -at- BSDIWeb.com, я свяжу исходный код для моей библиотеки классов SQL и связанного с ним кода sproc. генератор и разместите его на нашем сайте. Если я получу один или два запроса, я отправлю его, а затем вернусь и отредактирую этот ответ, чтобы также указать другим на источник.

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

Новая Entity Framework от Microsoft предоставляет именно то, о чем вы просите. EF обычно используется для создания прокси-классов для объектов базы данных, но многие люди не понимают, что он также создает прокси-методы для хранимых процедур (автоматически сгенерированных, конечно). Это позволяет вам использовать ваши SP так же, как если бы они были обычными вызовами методов.

Проверьте это!

Другие вопросы по теме