C#应用程序-我应该使用存储过程还是ADO.NET与C#编程技术?

6
我正在创建一个使用 SQL Server 存储所有数据的 C# 应用程序。
有时,以编程方式进行数据更改会更容易些,有时在 SQL Server 数据库中编写存储过程和函数并调用它们会更为方便。
作为一名新手,我不知道每种方法的微妙优缺点。
我认为我应该使用一种方法而不是多种方法来完成事情。
我的代码开始像随意堆砌的想法集合,没有冒犯 Joel Spolsky 的意思。我喜欢他的书。
这是一个单人项目,所以我可以重构任意数量的代码来使其更好。 所有选项都考虑在内。
谢谢,
J3r3myK
5个回答

10
储存过程可以是一层额外的抽象或者函数/方法集,如果你像处理对象或服务一样看待数据库。这很有益,因为你可以隐藏底层实现细节,并在需要时更改它而不会破坏应用程序(只要保留接口,例如储存过程参数)。此外,如果你能将表格详情隐藏在一组储存过程后面,无论任何人如何访问你的数据库,他们都只能使用你设计和编写的方法来与它交互 --> 这样,就减少了某人启动 Excel 并入侵你的数据库的风险。
另一方面,储存过程需要广泛的 T-SQL 知识,并且你将把业务和应用逻辑分散到两个代码库中,这可能是一个缺点。任何在储存过程中能做的事情也都可以通过直接的 SQL 语句在 ADO.NET 中完成,而且速度也不再慢了。
储存过程的另一个优势是,如果在你的储存过程中出现问题,你可以仅通过部署修复过的储存过程来进行修复 - 你不需要触及 C# 应用程序。这在“托管”环境中可能是一个巨大的优势,如果你每年只能获得3次发布 - 那么通过修复储存过程来应用热修复可能是你的救命稻草! :-)
总之:对于储存过程有很多利弊,如果你感觉写 T-SQL 很舒适,为什么不试试看它对你的工作效果如何呢?如果感觉太麻烦、过于死板或在长期运行中需要太多工作,你可以随时切换回在 C# 应用程序中使用直接 SQL。
只是我的 $0.02。马克

7

还有两个方面需要注意:

存储过程可以放置在模式中,并代表不同的模式。这意味着您可以锁定数据库访问并仅授予用户执行SProcs的权限,而不是选择更新等等, 这是一个非常好的安全性奖励。

其次,根据您所执行的操作,存储过程可以显著提高速度。如果通过网络IO限制了数据集的操作,且您能够对数据进行集合操作,那么在单个存储过程中执行此操作而不是获取整个数据集、处理它,然后传输更改将为您提供很好的速度提升。

同样适用于事务,如果需要串行执行操作(例如同时更改两张表中的值涉及某些逻辑),则必须保持事务时间,以便您计算值并在两个 SQL 查询中传回,而存储过程可以在单个过程中完成。


4
好的,无论如何,您都将使用ADO.NET...听起来像是指存储过程与命令文本。两者都有优点,所以这不是一个简单的问题,但是,如果您正在查看类似LINQ的工具,则使用命令文本会更有优势,因为它可以更加“可组合”(即调用者可以添加Skip/Take/Where/OrderBy并影响整个查询)。
另一个混合了两者优点的选项是表值函数(通过UDF)-它们也具有更强的元数据优势(准确查询存储过程的模式很困难)。
只要正确使用参数,任何方法都应该是注入安全的。

3
让我来重新表达一下:您是否应该从数据中取出数据,通过代码进行修改,然后让SP使用新值更新DB,还是将SP作为“函数”调用。
我的重点是,即使您在代码中进行数据操作,仍应仅访问db上的SP。
是否这样做,或者是否由更复杂的SP进行数据操作,取决于几个因素:
  • 您对复杂SQL(而不是C#)的熟悉程度
  • 您需要提取和修改多少数据-可能存在性能方面的问题(将所有数据拉到代码中会有成本)
  • 与前一个因素相关的是,您的架构可能会起作用-例如,您是否正在访问本地db服务器或远程服务器
  • 您需要进行何种类型的操作,它可能非常复杂,您不想混淆您的SQL
  • 您需要执行哪种业务逻辑,数据依赖于什么等等。
这真的取决于判断,没有正确的方法(虽然有很多错误的方法...)。虽然保持一致很重要,但在系统中具有不同类型的db访问是完全可以接受的,只要上下文/需求证明其合理。
我会说选择您最熟悉的那个,并坚持下去-直到您有理由以不同的方式做到这一点。没有理由固执己见...

0
我建议遵循一种约定(要么将SQL代码作为类中的字符串,要么使用存储过程)。虽然有无数关于这个问题的争论,但实际上没有选择其中之一的重要原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接