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





Вам следует попробовать LINQ to SQL.
Когда хранимые процедуры являются интерфейсом для базы данных, я стараюсь обернуть их в классы, которые отражают проблемную область, так что большая часть кода приложения использует эти объекты, а не вызывает хранимые процедуры и даже не знает о хранимых процедурах или подключение к базе данных. Объекты приложения обычно играют между собой.
Я считаю ошибкой зеркалировать SP в вашем приложении, поскольку, как правило, ваша реляционная модель не совпадает с 1-1 объектной моделью предметной области приложения.
Например, обычно у меня нет объектов приложения, которые представляют таблицы ссылок или другие артефакты проектирования и нормализации базы данных. Это коллекции объектов, которые либо содержатся в других объектах, либо возвращаются ими.
Из-за несоответствия импеданса многое связано, но я думаю, что это лошади для курсов - пусть базы данных делают то, в чем они хороши, а объектно-ориентированные модели делают то, в чем они хороши.
В этом случае я рекомендую просто генерировать код из вашей базы данных - например, с помощью CodeSmith.
Вы изучали использование Корпоративная библиотека от 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 так же, как если бы они были обычными вызовами методов.
Проверьте это!
Я согласен, и зеркальный проект использовался в архитектуре, управляемой доменом, а не для прямого доступа к хранимым процедурам бизнес-логике. Причина, по которой я сделал это проектом, заключалась в возможности находить ссылки и автоматически генерировать имена процедур.