3

这不是关于 SP 是好是坏的问题。或者用 C# 编写 SQL 语句是好是坏。

很快我们就开始着手一个新项目,这是一个典型的库存/计费管理系统。这将使用 .Net 和 C# 作为语言进行开发。数据库尚未最终确定。

此应用程序中不允许使用存储过程,它将具有中等到复杂的数据库操作。因此,我可以使用 SP 轻松编写的逻辑,现在我必须使用 C# 和 ADO.Net 编写。

现在以一个非常假设的用例为例,客户选择了 5 件商品并准备好在柜台生成账单……。这通常具有以下数据库操作:

  • 检查 INVENTORY 表以查看是否所有 5 行项目都可用(数量充足)。
  • 如果任何项目不可用 - 从账单中删除项目并更新 BILL 表
  • INVENTORY 表的数量字段将被更新,并且数量字段将扣除已售出的项目。
  • 警报/更新其他表是项目的阈值数量低于某个点。

现在看看这个场景,这一切都可以在 SP 中轻松完成。这包含很多查询、IF 条件、可能的循环等,看起来像是 SP 的一个很好的竞争者。我想从专家那里得到的是:

  1. 是否有在 C# 和 ADO.Net 中编写此类代码的最佳实践。在 C# 中,我们通常可以使用 ADO.Net 重新创建相同的代码……。但这是唯一的方法还是正确的方法?
  2. 我读过很多人说存储过程不好…… 但是当考虑像这样的复杂场景时……你不觉得存储过程更适合这种情况吗?
4

1 回答 1

6

是否有在 C# 和 ADO.Net 中编写此类代码的最佳实践。在 C# 中,我们通常可以使用 ADO.Net 重新创建相同的代码……。但这是唯一的方法还是正确的方法?

因此,我认为根据您的问题,您会更乐意使用Dapper之类的东西来访问数据库。如果您不知道,Dapper 是一个非常轻量级的数据库访问库,它甚至支持一些更复杂的需求(例如在一次往返中返回多个结果集,然后将这些结果反序列化为 POCO 类)。

简而言之,使用 Dapper,您可以灵活地按照自己的方式查询数据库,而且速度快得离谱。

现在,举一个更具体的例子,Dapper 扩展了IDbConnection接口,所以你选择什么数据库并不重要:

数据库尚未最终确定。

它很容易参数化,因此不受SQL 注入的影响:

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);

老实说,虽然实体框架真的越来越流行,而且微软正在向他们投入大量资金,但我在使用 Dapper 后不再购买它们。这就是为什么。一般来说,最好利用数据库来做它最擅长的事情,Dapper 允许这样做,它所做的只是为您提供一种机制,通过该机制,您可以大大减少从数据库中获取数据和执行数据库所需的样板代码ADO.NET。

现在,这是进入存储过程参数的好方法。

我读过很多人说存储过程不好…… 但是当考虑像这样的复杂场景时……你不觉得存储过程更适合这种情况吗?

存储过程还不错。大多数人说这可能来自两个角度之一:

  1. 他们只是在赶潮流。
  2. 他们不知道存储过程的目的和好处。请注意:我没有说愚蠢,我说的是无知

尽管人们普遍认为,存储过程有一个很好的用途。首先,编译执行计划。其次,它们很容易参数化以更快地进行更复杂和多级的查询 - 而视图和直接 SQL 则不是。第三,它们更容易被 DBA 保护。

我有一个查询,它是一个直接的 SQL 查询,因为我当时工作的公司也有同样的想法,我通过将其设置为存储过程将其性能提高了 98%。这在他们准备购买的额外硬件上为公司每月节省了 2,000 美元!

正如我之前所说,将数据库用于它擅长的领域。我认为这经常会丢失,因为我看到很多人试图使用 C# 和 .NET 框架对 500,000 个对象进行排序,但他们无法弄清楚为什么它不够快 -他们应该在数据库服务器上对它们进行排序!这是它真正擅长的一件事!

不要让人们把你引向技术无用和糟糕的道路,因为许多人会告诉你触发器是糟糕的,但如果使用正确的理由,它们是完美的!

于 2013-03-08T15:02:29.300 回答