C# 与代码相比,将SQL保留在存储过程中的优点和缺点是什么
在C#源代码或存储过程中保留SQL有哪些优点/缺点?我一直在和一个朋友讨论这个问题,他正在做一个开源项目(C#ASP.NET论坛)。目前,大多数数据库访问都是通过在C#中构建SQL内联并调用SQL Server DB来完成的。所以我想确定,对于这个特殊的项目,哪一个是最好的 到目前为止,我已经: 在代码中使用的优点: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脚本来更新查询 更容易移植到另一个数据库-无需程序移植到端口 存储过程的优点: 演出 保安 存储过程的性能优势通常是可以忽略的 存储过程的更多优点:
- 易于维护-不需要运行SQL脚本来更新查询
- 更容易移植到另一个数据库-无需程序移植到端口
- 演出
- 保安
- 防止反向工程(当然,如果使用加密创建)
- 更好地集中数据库访问
- 能够透明地更改数据模型(无需部署新客户端);如果多个程序访问同一个数据模型,特别方便
我认为维护存储过程并不难,您不应该直接在数据库中编写它们,而应该先在单独的文件中编写,然后您可以在需要设置的任何数据库上运行它们。我更喜欢在代码中保存它们(使用ORM,而不是内联或临时)因此,它们由源代码管理覆盖,而不必保存.sql文件
此外,存储过程本身并不更安全。使用存储过程编写错误的查询与内联查询一样简单。参数化内联查询可以和存储过程一样安全。目前,其他几个线程正在讨论这一点。我一贯支持存储过程,尽管有人提出了一些关于Linq到Sql的好论点 在代码中嵌入查询将您与数据模型紧密地结合在一起。存储过程是契约式编程的一种良好形式,这意味着DBA可以自由更改过程中的数据模型和代码,只要存储过程的输入和输出所表示的契约得到维护 如果查询隐藏在代码中,而不是在一个易于管理的中心位置,那么调整生产数据库可能会非常困难 [编辑]这里是另一个 在代码中使用的优点:
- 易于维护-不需要运行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