这不是关于 SP 好坏的问题。或者用 C# 编写 SQL 语句是好是坏。
我们很快就会开始一个新项目的工作,这是一个典型的库存/计费管理系统。这将使用 .Net 和 C# 作为语言进行开发。该数据库尚未最终确定。
在此应用程序中不允许使用存储过程,它将具有中等到复杂的数据库操作。因此,我可以使用和 SP 轻松编写的逻辑现在必须使用 C# 和 ADO.Net 编写。
现在考虑一个非常假设的用例,客户选择了 5 件商品并准备在柜台生成账单……。这通常会有以下数据库操作:
- 检查 INVENTORY 表以查看所有 5 个行项目是否可用(数量充足)。
- 如果任何项目不可用——从账单中删除该项目并更新 BILL 表
- 将更新 INVENTORY 表的数量字段,并从已售出的商品中扣除数量字段。
- 提醒/更新其他表是项目的阈值数量低于特定点。
现在看看这个场景,这本可以在 SP 中轻松完成。这包含很多查询、IF 条件、可能的循环等,看起来是 SP 的一个很好的竞争者。 我想从专家那里得到的是:
- 是否有使用 C# 和 ADO.Net 编写此类代码的最佳实践。在 C# 中,我们通常可以使用 ADO.Net 重新创建相同的代码......但这是唯一的方法还是正确的方法?
- 我读过很多人说存储过程不好……但是在考虑像这样的复杂场景时……您不觉得存储过程更适合这种情况吗?
最佳答案
Are any best practices for writing such code in C# & ADO.Net. In C# we can typically recreate the same code using ADO.Net…. BUT IS THIS THE ONLY WAY OR THE CORRECT WAY?
所以我认为根据你的问题,你会更快乐地使用像 Dapper 这样的东西用于您的数据库访问。如果您不知道,Dapper 是一个极其轻量级的数据库访问库,它甚至支持一些更复杂的需求(例如在单次往返中返回多个结果集,然后将这些结果反序列化为 POCO 类)。
简而言之,借助 Dapper,您可以完全按照自己的需要灵活地查询数据库,而且速度快得离谱。
现在,举一个更具体的例子,Dapper 扩展了 IDbConnection
接口(interface),所以你选择什么数据库并不重要:
The database is not yet finalized.
它很容易参数化,所以它不受 SQL Injection 的约束:
var parms = new { ID = 1, Bar1 = "Hello" };
var foo = connection.Query<Foo>(
"SELECT Bar1, Bar2 FROM Foo WHERE ID = @ID AND Bar1 = @Bar1",
parms);
并且它支持事务,因此您仍然可以将操作作为单个事务进行管理:
var tran = connection.BeginTransaction();
var parms = new { ID = 1, Bar1 = "Hello" };
var foo = connection.Query<Foo>(
"SELECT Bar1, Bar2 FROM Foo WHERE ID = @ID AND Bar1 = @Bar1",
parms, tran);
老实说,虽然 Entity Framework 真的越来越流行,而且微软正在向他们投入 吨 资金,但在使用 Dapper 后我不再购买它们了。这就是为什么。一般来说,利用数据库发挥它的最大优势要好得多,Dapper 允许这样做,它所做的只是为您提供一种机制,您可以通过该机制大幅减少从 ADO.NET 中的数据库获取数据并针对数据库执行所需的样板代码。
现在,这是进入存储过程参数的好方法。
I have read a lot of people saying stored procedures are bad…. but when considering a complex scenario like this… don’t you feel that stored procedures are better suited in this case.
存储过程还不错。大多数人说这可能来自两个角度之一:
- 他们只是赶时髦。
- 他们不了解存储过程的用途和好处。 请注意:我没有说愚蠢,我说的是ignorant .
尽管人们普遍认为,存储过程有一个很好的用途。首先,编译执行计划。其次,它们很容易参数化以更快地进行更复杂和多层次的查询——而 View 和直接 SQL 则不然。 第三,DBA 更容易保护它们。
我有一个查询,它是一个直接的 SQL 查询,因为我当时工作的公司也有同样的想法,我通过将其设为存储过程将其性能提高了 98%。 这为公司每月在他们准备购买的额外硬件上节省了 2,000 美元!
正如我之前所说,利用数据库发挥它的优势。我认为这经常被遗忘,因为我看到很多人试图使用以下方法对 500,000 个对象进行排序C# 和 .NET 框架,他们无法弄清楚为什么速度不够快 - 他们应该在数据库服务器上对它们进行排序!这是一回事 真的擅长!
不要让人们误导您认为一项技术无用且糟糕,因为很多人会告诉您触发器很糟糕,但是当出于正确的原因使用它们时,它们是完美的!
关于c# - 将复杂的存储过程转换为 C# 和 ADO.Net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15290686/