使用存储过程是一种方法,并且已经广泛使用了很多年。
从C#(或任何.NET语言)与SQL Server数据库进行交互的更现代的方法是使用实体框架。实体框架的优点是它提供了更高级别的抽象。
引用Microsoft(https://msdn.microsoft.com/en-us/data/jj590134):
ADO.NET实体框架使开发人员可以通过对概念性应用程序模型进行编程,而不是直接对关系存储架构进行编程来创建数据访问应用程序。目标是减少面向数据的应用程序所需的代码量和维护量。实体框架应用程序具有以下优点:
- 应用程序可以以更以应用程序为中心的概念模型来工作,包括具有继承的类型,复杂的成员和关系。
- 应用程序摆脱了对特定数据引擎或存储架构的硬编码依赖。
- 在不更改应用程序代码的情况下,可以更改概念模型与特定于存储的架构之间的映射。
- 开发人员可以使用一致的应用程序对象模型,该模型可以映射到各种存储模式,并且可能在不同的数据库管理系统中实现。
- 可以将多个概念模型映射到单个存储模式。
- 语言集成查询(LINQ)支持为针对概念模型的查询提供了编译时语法验证。
ORM与存储过程的使用涉及权衡,尤其是在安全性和逻辑所在方面。
使用SQL Server进行开发的“经典”方法是使应用程序逻辑驻留在存储过程和程序中,而这些程序和程序仅具有执行存储过程的安全权限,而不能直接更新表。这里的概念是存储过程是应用程序的业务逻辑层。尽管该理论是合理的,但由于各种原因,它已趋于失宠,被以C#或VB等编程语言实现业务逻辑所取代。好的应用程序仍采用分层方法来实现,包括关注点分离等,但是更可能遵循MVC之类的模式。
在ORM中而不是数据库中实现逻辑的一个缺点是负责数据库(DA或DBA)的人员易于调试和测试数据完整性规则。以将钱从支票转入储蓄帐户的经典示例为例,将其作为原子的工作单元来完成,换句话说,将其夹在交易中非常重要。如果仅允许通过存储过程进行这种转移,则DA和审核员对存储过程进行质量检查相对容易。
另一方面,如果这是通过诸如Entity Framework之类的ORM完成的,并且在生产中发现,在极少数情况下,从检查中获取资金却没有节省下来,调试可能会更加复杂,尤其是在可能涉及多个程序的情况下。这很可能是一个边缘情况,可能涉及需要按特定顺序等发生的特殊硬件问题。如何对此进行测试?