将COMPLEX存储过程转换为C#& ADO.Net

时间:2013-03-08 09:30:23

标签: c# stored-procedures ado.net

这不是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. 我看过很多人说存储过程很糟糕......但是在考虑像这样的复杂场景时......你不觉得存储过程在这种情况下更适合。

1 个答案:

答案 0 :(得分:5)

  

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

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

简而言之,使用Dapper,您可以灵活地查询数据库 完全按照您的需要 ,并且 可笑得非常快。

现在,对于更具体的示例,Dapper扩展了IDbConnection接口,因此您选择的数据库并不重要:

  

数据库尚未最终确定。

它很容易参数化,因此不受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);

并且说实话,尽管实体框架真的越来越受欢迎,而且微软正在向他们投入大量的资金,但是在使用Dapper后我不会再购买它们了。这就是原因。一般来说,利用数据库获得最佳效果要好得多,Dapper允许这样做,它所做的只是为您提供一种机制,您可以通过该机制 大幅减少 在ADO.NET中从数据库获取数据和执行数据所需的样板代码。

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

  

我看过很多人说存储过程很糟糕......但是在考虑像这样的复杂场景时......你不觉得存储过程在这种情况下更适合。

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

  1. 他们只是在赶时髦。
  2. 他们对存储过程的目的和好处一无所知。 请注意: 我没有说 愚蠢 ,我说ignorant
  3. 尽管存在普遍的看法,但存储程序仍然是一个很好的目的。首先,编译执行计划。其次,它们很容易参数化,以便更快地进行更复杂的多级查询 - 而视图和直接SQL则不然。 第三,他们更容易获得DBA的保障。

    我有一个查询,这是一个直接的SQL查询,因为我当时工作的公司认为完全相同的事情,并且我通过将其作为存储过程将其性能提高了98%。这使公司每月节省2000美元的额外硬件,他们准备购买!

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

    不要让人们引导你走上技术无用而且糟糕的道路,因为许多人会告诉你触发器是坏的,但是当正确使用它们时它们是完美的! < / p>