【发布时间】:2011-08-28 21:33:15
【问题描述】:
2017 年更新:
实际上,答案是否,即使有你也应该非常谨慎地使用它。
实际上只有两种方法可以解决这个问题:
a) 咬紧牙关,手动、费力地转换所有内容,并使用某种验证方法来检查所有内容是否继续按预期运行,例如单元/回归测试。使用 Linqer 等工具(如果可用)作为帮助,以解决部分问题。
b) 从头开始。
没有选择 c) 让其他东西整齐而自动地处理所有事情,而且它不可能涵盖所有情况。 T-SQL 可以做很多 LINQ 不能做的事情(更新、插入和删除),还有很多事情你最好在 C# 中用不同的方式做(比如游标)。
很少有像这样的问题得到精心设计、详尽的解决方案,可以相信不会使功能退化(例如商业 VB6 到 VB.NET 转换器,由于潜在客户的数量庞大,这可能证明花费巨大的努力是合理的,并且如果出现问题,您可以在哪里接电话或找律师),所以如果存在这样的工具,您应该非常小心。从与 LINQ 兼容的 SQL 子集到 LINQ 的转换是一个有限的问题,并且我认为 Linqer 可以被信任。
这个问题试图找出一个可以帮助选项 a) 的工具,但我想很多阅读这篇文章的人都在寻找选项 c)。这个问题和答案的一个子集并不是一个可怕的想法,但它并没有自动消除剩余的负担,因为即使是许多简单的存储过程也不仅仅是以 LINQ 可表达的形式进行查询。对于我提到的任何项目,选择 a) 仍然太站不住脚。
原问题如下:
我有几个项目需要维护,这些项目使用大量 SQL Server 存储过程(在 T-SQL 中)。我知道如何维护它们,但是由于有很多工具可以在不同的语言之间自动转换,我想知道是否有任何工具可以将存储过程转换为 C# 代码?
我不想将它们转换为 CLR 存储过程;我只是想将数据层中的逻辑迁移到项目的 C# 端并自动化繁重的工作。大多数存储过程(可能是 70%?)都是简单的“SELECT * FROM table WHERE id = @id”事务,它们也可以通过 Entity Framework 来完成。
我知道 T-SQL 和 C# 之间不是一条直线,因为它是从 VB.NET 到 C#,而且转换也不是那么简单;例如,您将需要在 C# 中引入一个数据层,而光标之类的某些东西没有相应的概念。如果可能的话,我只想摆脱存储过程而无需重复的体力劳动。
由于错误的假设已经对此提出质疑:我已经知道 T-SQL,并且给出了这些存储过程中的任何一个的代码,我可以告诉您它们的作用。我不希望逻辑继续驻留在存储过程中有很好的实际原因。
【问题讨论】:
-
不要这样做...不。
-
坏主意 - T-SQL 存储过程功能强大并且使用是有原因的 - 将它们移动到 C# 不会给您带来任何好处 - 但有很多缺点。不要这样做。习惯 T-SQL。
-
我重新表述了我的问题。存储过程大多不是做 T-SQL 最擅长的存储过程,而是为了成为存储过程而存储过程,因为做一个简单的、赤裸裸的 SELECT 对灵魂有害。请重新考虑。
-
如果你重新开始,这可能是一个不同的讨论(而且我相信这里有很多关于使用存储过程的主题)。但由于它们已经以这种方式实现,请不要将它们更改为 C#。
-
我认为这是一个有效的问题。当前存储过程中可能有业务逻辑,最好将其移至应用程序层;或者它可以作为一个学习练习。
标签: c# sql-server tsql stored-procedures