自动代码生成和VBA脚本

   这里说的自动代码生成专指从数据库结构->代码,这种需要在O/R Mapping中是必不可少的,包括Entity Class和Xml Mapping File的生成,在以数据库为中心的开发中(尤其是MIS),自动代码生成可以起到快速开发,易于维护的作用。我有非常长的一段时间不再执行拼接SQL语句的操作了,因为对于row的操作,我都通过EntityManager实现,而rowset的操作,我是通过一种折衷的方法去实现的(具体可以参考我的SinoLib)。

    代码自动生成我目前所知有两种方法,一种是模板,一种是脚本,模板方法比较常见些,而且可以满足绝大多数情况的需要,通过插入一些自定义的TAG,再用程序来解析;而脚本执行的方法就是非常灵活和强大的,因为很多时候,需求是很古怪特殊的,所以普通的模板难以完成这种代码生成。

    CegCodeDG是我写的两个代码自动生成软件,分别就是上述两种方法的实现,长期以来,我用CEG完成我几个O/R Mapping框架的代码生成,并且在SinoLib之前,它都能很好地完成任务。但是SinoLib因为数据平台无关性的需要,所以使用了Xml文件来描述实体类所对应的表对象(可能是table、view或是一个select)信息,但由于其格式的特殊性,Ceg无法通过模板生成,我只能在生成后的Xml文件中再手工进行修改。另外还有一个特性Ceg无法满足,就是生成Java类文件时,类外的第一个字母需要大写,而表名却全是小写,这个时候如果要模板方法支持的话,只能再添加一个TAG,如<Ucase>,所以模板方法的扩充是极为不便的,并且功能有限,同时就软件实现来说,脚本方法实际要比前者更加容易得多。

    因为前些时间在项目中使用了ScriptControl进行脚本支持,所以决定开发CodeDG来弥补Ceg的不足,并且完全替代Ceg,实际上关于脚本支持的想法我在很早以前就有了,只是一直没有将它实现。经过周末一天多时间的开发,CodeDG完成了,它的特性包括:
    1、完成兼容VBA语法
    2、类似于ASP的内嵌式脚本语法,并且支持<%= .. %>
    3、支持函数和过程定义,添加IIF函数,App对象
    4、通过软件传递进来的Schema、Table对象访问当前数据库的结构信息

    其实CodeDG本来并不完成代码自动生成的功能,它主要是一种数据库结构信息获取和脚本解析和执行的平台,通过统一的接口向您的脚本暴露数据库结构信息(目前只支持MSSQL、Access的Table),您可以利用VBA创建文件生成需要的代码,也可以调用Excel或Word的Application来生成数据字典,它的整个表现模式和ASP非常相似,用动态的脚本,去创建静态的页面,当然,您还可以通过MsgBox来执行一些更加复杂的操作。
    
    加入脚本支持在您的程序中其实非常容易,您可以定义一些您特有的语法特性,如CodeDG的<%..%>脚本包含,然后将程序中的对象通过AddObject方法添加到ScriptControl对象,这样脚本就能够访问这些和您程序有关的资源了,接着就是执行脚本了,而要获得执行结果,有两个方法:一是通过模块内的public级变量,二是通过FUNCTION直接得到返回值。   

    这个Post虽然不是.Net的,但是.Net下的CodeDom同样可以实现类似功能,并且会更加强大。

posted @ 2009-05-22 17:46  未未  阅读(1753)  评论(0编辑  收藏  举报