希望设计一个工具,将业务逻辑从存储过程转换为C#业务层

时间:2010-07-21 14:10:19

标签: c# nhibernate oracle9i

没有讨论业务逻辑是应该在数据库中还是在应用程序层,因为它已被覆盖elsewhere

我的团队正在翻译 100K + 行的PL / SQL代码,并将逻辑从数据库移到应用程序中。我们使用VB6直接调用Oracle 9i存储过程和Ad-hoc查询,现在使用C#,。net 3.5,Winforms和NHibernate到Oracle 9i数据库。

我们已经找到了一个很好的工具来帮助转换Ad-hoc查询SmartCode,但它只创建基于表和视图的代码。我们正在寻找一种工具来协助转换存储过程。

存储过程中包含我们要迁移到应用程序层的大部分业务逻辑。我们想知道是否有任何工具可以将存储过程转换为C#代码。

假设没有,如果我们开发内部/开源工具,最好的起点是什么。还有另一个具有类似目标的类似系统可以用作起点吗?

接受的答案更新: 我选择了范围蠕变的答案,因为它似乎是实现问题中提出的问题的最佳方法。对于那些处理同一问题的人,我衷心地推荐Adam的回应,因为他强烈主张反对使用工具并提供强有力的理由。他还提供了与这个问题最多的互动,并且得到了最多的投票反应。

感谢大家的帮助和对话。

5 个答案:

答案 0 :(得分:12)

我不相信SQL到C#有任何转换器。

至于接近创建这样一个工具,我首先要说的是,不要......你的业务需求听起来像将逻辑引入C#。

根据应用程序的状态,您可以通过多种方式执行此操作:一次一个;一次逻辑实体(所有客户逻辑等);整猪; agile-ish你暂时离开sprocs并直接从C#调用它们,然后慢慢采取一种先前的方法 - 总是给自己留下一个正常运行的应用程序。

真正加载的问题: - )

我个人会先尝试让它在C#中直接调用sprocs。然后采用逻辑实体,因为您会发现它们可能引用其他的sprocs。一次执行一个sproc会在开发过程中分割你的C#逻辑,并为创建业务类增加额外的开销。

C#域模型的优势在于责任的明确界限以及将行为分组到逻辑实体中 - 因此,一次采用一个特殊的,您将看不到更大的图景。使用转换器,它将以您不得不学习的不可读,无法管理的代码结束 - 如果您首先创建它,则无需执行此操作。

所以我的结论,如果有的话,就是为了节省自己的未来时间,并把它作为重新设计业务层的机会 - 因为你可能从野外获得系统生产行为的知识和经验,所以转换可以考虑任何经验教训。

更新,结果证明您有转换的工具选项。对于这种方法我唯一要说的是: 结果代码不会很漂亮 。您的好处是开发团队可以理解您当前的SQL - 他们知道代码。代码生成器将生成100%新代码,无人知晓。学习曲线......因为您需要 验证 工具的输出,以确保它不会改变您的逻辑 - 没有工具是绝对可靠的。

如果您决定使用该工具,我只能建议将转换分解为非常非常小的部分(可能最小的将是一个脚本(或者甚至可能是脚本中的批处理))。如果您有一小组转换结果,请将其集成到应用程序中并将其传递给审核流程。

答案 1 :(得分:2)

一种方法是使用ANTLR v3来构建特定于域的语言。 ANTLR V3有一个PL / SQL Pl / SQL grammer用于10g,11g用于构建PL / SQL的词法分析器/解析器,这将是第一步。 C#3.0代码生成器可用于C#3.0的后端。代码生成器仍在开发中,但它处于高级状态。

我不知道这种方法会带来多少工作,但我当然认为它比手工翻译费用低。

有一本名为The Definitive ANTLR Reference: Building Domain-Specific Languages 的书。我知道在这个时候建议你写一本书,当你有大量的工作要做时,它会让你对所涉及的过程有所了解,也许足以让转换成本降低。

Stack Overflow上已经有一个问题:Writing a Language Translator链接到ANTLR Morph项目,该项目是一个定义公共翻译机制的子项目。 DocFAQ解释了它的工作原理。本质上,脚本用于定义转换机制。它还处于早期阶段,但值得一看,因为这是一个尚未解决的常见情况。

此示例说明了如何创建树转换,即走树以输出已翻译的代码,可在此处找到:Tree Translations,以及相关的ANTLR文档:Tree Consuruction

找到合适的编译工程师是成功的关键。我看了一些网站,他们是一些可用的编译工程师。我认为使用1或2个编译工程师3个月以上的工作要比使用超过4个工程师工作3个月以上的人工翻译更便宜。在英国,你会找一个承包商去做。

希望有所帮助 鲍勃。

编辑:01/08

我找到了另一本讨论创建语言翻译的书,在这里可以找到 Language Implementation Patterns

答案 2 :(得分:0)

我找不到任何将PL / SQL直接转换为C#的东西,但发现了一些将PL / SQL转换为Java(然后可以转换为C#)的产品。

将PL / SQL转换为Java:

SwisSQL:http://www.swissql.com/products/oracle-to-java/oracle-to-java.html
出埃及记:http://www.ciphersoftinc.com/products/plsql-to-java-conversion-tools.html

将Java转换为C#

StackOverflow回答:Tool to convert java to c# code

答案 3 :(得分:0)

基于范围 - 蠕变,Adam和Ira-Baxter的输入。特别是,关于以一口大小的方式做事,明确责任界限和行为分组

一种方法是扩展SmartCode工具,它已经生成了可以使用的好实体,因为它是开源的:

  1. 扩展工具以读入存储过程,允许选择具有反向表/视图选择的存储过程(假设存储过程中有任何对当前未映射的表/视图的引用)。
  2. 使用表和视图创建的实体,将包含包含存储过程的包转换为类层次结构。
  3. 使用词典和语法翻译业务逻辑。
  4. 思想?

答案 4 :(得分:-1)

我希望这会有所帮助:

如果您正在使用Oracle进行NHibernate,那么您需要阅读Devio的博客。

  • LLBLGen Pro功能:

    • 代码的构建块:实体,值类型,类型列表,类型化视图和存储过程调用。