C# 与代码相比,将SQL保留在存储过程中的优点和缺点是什么

C# 与代码相比,将SQL保留在存储过程中的优点和缺点是什么,c#,sql,sql-server,stored-procedures,C#,Sql,Sql Server,Stored Procedures,在C#源代码或存储过程中保留SQL有哪些优点/缺点?我一直在和一个朋友讨论这个问题,他正在做一个开源项目(C#ASP.NET论坛)。目前,大多数数据库访问都是通过在C#中构建SQL内联并调用SQL Server DB来完成的。所以我想确定,对于这个特殊的项目,哪一个是最好的 到目前为止,我已经: 在代码中使用的优点: 易于维护-不需要运行SQL脚本来更新查询 更容易移植到另一个数据库-无需程序移植到端口 存储过程的优点: 演出 保安 存储过程的性能优势通常是可以忽略的 存储过程的更多优点:

在C#源代码或存储过程中保留SQL有哪些优点/缺点?我一直在和一个朋友讨论这个问题,他正在做一个开源项目(C#ASP.NET论坛)。目前,大多数数据库访问都是通过在C#中构建SQL内联并调用SQL Server DB来完成的。所以我想确定,对于这个特殊的项目,哪一个是最好的

到目前为止,我已经:

在代码中使用的优点:

  • 易于维护-不需要运行SQL脚本来更新查询
  • 更容易移植到另一个数据库-无需程序移植到端口
存储过程的优点:

  • 演出
  • 保安

存储过程的性能优势通常是可以忽略的

存储过程的更多优点:

  • 防止反向工程(当然,如果使用加密创建)
  • 更好地集中数据库访问
  • 能够透明地更改数据模型(无需部署新客户端);如果多个程序访问同一个数据模型,特别方便
存储过程

如果出现错误或逻辑稍有改变,则不必重新编译项目。另外,它允许从不同的来源进行访问,而不仅仅是在项目中编码查询的地方


我认为维护存储过程并不难,您不应该直接在数据库中编写它们,而应该先在单独的文件中编写,然后您可以在需要设置的任何数据库上运行它们。

我更喜欢在代码中保存它们(使用ORM,而不是内联或临时)因此,它们由源代码管理覆盖,而不必保存.sql文件


此外,存储过程本身并不更安全。使用存储过程编写错误的查询与内联查询一样简单。参数化内联查询可以和存储过程一样安全。

目前,其他几个线程正在讨论这一点。我一贯支持存储过程,尽管有人提出了一些关于Linq到Sql的好论点

在代码中嵌入查询将您与数据模型紧密地结合在一起。存储过程是契约式编程的一种良好形式,这意味着DBA可以自由更改过程中的数据模型和代码,只要存储过程的输入和输出所表示的契约得到维护

如果查询隐藏在代码中,而不是在一个易于管理的中心位置,那么调整生产数据库可能会非常困难

[编辑]这里是另一个

在代码中使用的优点:

  • 易于维护-不需要运行SQL脚本来更新查询
  • 更容易移植到另一个数据库-无需程序移植到端口
事实上,我想你已经把它倒过来了。恕我直言,代码中的SQL很难维护,因为:

  • 您最终会在相关的代码块中重复自己
  • SQL在许多IDE中不支持作为一种语言,因此您只有一系列未经错误检查的字符串为您执行任务
  • 数据类型、表名或约束的更改比将整个数据库换成新数据库要普遍得多
  • 随着查询的复杂性增加,难度也会增加
  • 测试内联查询需要构建项目
将存储过程视为从数据库对象调用的方法-它们更易于重用,只有一个地方可以编辑,如果您更改了数据库提供程序,更改将发生在存储过程中,而不是代码中


也就是说,正如斯图在我之前所说的,存储过程的性能提升是最小的,而且你还不能在存储过程中设置断点。

我参加的一次Microsoft TechEd安全会议的建议之一,通过存储过程进行所有调用并拒绝直接访问表。这种方法被宣传为提供了额外的安全性。我不确定这是否值得,只是为了安全,但如果您已经在使用存储过程,它不会有什么坏处。

如果您将它放在存储过程中,维护起来肯定会更容易。如果涉及到将来可能发生变化的困难逻辑,那么当您有多个客户端连接时,将其放入数据库中肯定是一个好主意。例如,我现在正在开发一个应用程序,它有一个最终用户web界面和一个管理桌面应用程序,这两个应用程序共享一个数据库(很明显),我正试图在数据库上保留尽可能多的逻辑。这是一个完美的例子。

这样想吧

您有4个Web服务器和一组使用相同SQL代码的windows应用程序 现在您意识到SQl代码有一个小问题 所以你宁愿。。。。。。 在1个位置更改进程 或 将代码推送到所有Web服务器,在所有windows框上重新安装所有桌面应用程序(clickonce可能会有帮助)

我更喜欢存储过程

将proc放在查询分析器中进行性能测试也更容易 将统计信息io/时间设置为on 将showplan_文本设置为on,然后瞧

无需运行探查器即可准确查看所调用的内容


就我的2美分

您列出了存储过程的2个专业积分:

性能-不太好。在Sql 2000或更高版本中,查询计划优化非常好,并且是缓存的。我相信甲骨文等也会做类似的事情。我认为再也没有理由用狂欢来换取表演了

保安?为什么存储过程会更安全?除非您有一个非常不安全的数据库,否则所有的访问都将来自您的DBA或通过您的应用程序。始终参数化所有查询-永远不要内联来自用户输入的内容,这样您就没事了

无论如何,这是最佳的性能实践

Linq绝对是我现在进行新项目的方式。看这个。

我倒在c上
(Pseudocode)

Function createOrder(Order yourOrder) 
Begin
  Call SP_createOrder(yourOrder)
End