c# - 将复杂的存储过程转换为 C# 和 ADO.Net

标签 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. 我读过很多人说存储过程不好……但是在考虑像这样的复杂场景时……您不觉得存储过程更适合这种情况吗?

最佳答案

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.

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

  1. 他们只是赶时髦。
  2. 他们不了解存储过程的用途和好处。 请注意:我没有说愚蠢,我说的是ignorant .

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

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

正如我之前所说,利用数据库发挥它的优势。我认为这经常被遗忘,因为我看到很多人试图使用以下方法对 500,000 个对象进行排序C# 和 .NET 框架,他们无法弄清楚为什么速度不够快 - 他们应该在数据库服务器上对它们进行排序!这是一回事 真的擅长!

不要让人们误导您认为一项技术无用且糟糕,因为很多人会告诉您触发器很糟糕,但是当出于正确的原因使用它们时,它们是完美的!

关于c# - 将复杂的存储过程转换为 C# 和 ADO.Net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15290686/

相关文章:

c# - 尽管有查询字符串,但在使用 sql COUNT 时 ExecuteNonQuery 返回 -1

c# - 如何让 GtkSharp 应用程序在 Windows 上运行

javascript - 将 View 模型数据传递给 javascript - 意外 token 非法

c# - 使用 linq 对计数的不同唯一事件进行排序

mysql - IF Else 在存储过程中不起作用

mysql - 在 MySQL 存储过程中使用选择

.net - 与 |Pipe-delimited| 有什么关系?连接字符串中的变量?

c# - 令人费解......为什么我的大多数链接在 ASP.NET MVC 中都附加了 Length=4?

mysql - 声明变量时 MySQL 存储过程中的语法错误

c# - 如何同时获取行数和行数