一 大概思路
1.1 工作原理
从数据库(这里主要用Oracle数据库),读取相应的表结构(如表名、列名、列类型、列注释等),然后读取模板(用txt写的模板),最后通过匹配生成目标代码。
二 代码解释
2.1 文件解释
2.2 解析方式
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace [XXX]
{
public class [table_name]
{
public [table_name]()
{
}
/// <summary>
/// [table_name]构造函数
/// </summary>
<!--/// <param name="v_[col_name]">[col_name]</param>
-->
public [table_name](<!--[col_type] v_[col_name][,]-->)
{
<!--this._[col_name] = v_[col_name];
-->
}
<!--
/// <summary>
/// [col_name]
/// </summary>
private [col_type] _[col_name];
public [col_type] [col_name]
{
get { return this._[col_name]; }
set { this._[col_name] = value; }
}
-->
}
}
App.config(配置数据库连接),以T_[filename].txt为模板,规则如下:
[XXX]暂时不考虑
<!-- -->标识符里的为可循环内容
[table_name]、[col_name]、[col_type]、[col_comment]、[create_time]、[,]、[col_comment]为可替换内容
解析顺序:
1. 读取数据库所有表 或 根据SQL语句,将表结构放入一个List<TableObject>结构里
2. 读取全文
3. 读取<!-- -->内容,以取代 [table_name]、[col_name]、[col_type]、[col_comment]、[create_time]、[,]
4. 继续读取,以取代[table_name]、<!-- -->
5. 输出[table_name].cs文件
2.3 以T_为开头的模板文件
/***************************************** -- create by: zhyongfeng -- create date: [create_time] -- fun: -- P_CONDITION:where条件 -- P_TYPE:是否分页 -- P_CUR_PAGE:第几页 -- P_PAGE_SIZE:每页记录数 -- X_TOT_REC:总记录数 -- X_TOT_PAGE:总页数 -- X_CUR:输出 *****************************************/ procedure [table_name]_Info_Select(P_CONDITION in Varchar2, P_TYPE varchar2, P_CUR_PAGE integer, P_PAGE_SIZE integer, P_SORT varchar2, P_DIR varchar2, X_TOT_REC out integer, X_TOT_PAGE out integer, X_CUR out curtype) as V_SQL long; V_TOT_REC integer; V_TOT_PAGE integer; begin V_SQL := 'select <!--e.[col_name][,] --> from [table_name] e'; exception When others then rollback; dbms_output.put_line('异常提示:'||sqlcode||':'||sqlerrm); end; /***************************************** -- create by: zhyongfeng -- create date: [create_time] -- fun:增加 <!-- -- P_[col_name]:[col_comment] --> -- X_RE:输出 -- X_MSG:输出 *****************************************/ procedure [table_name]_Add( <!-- P_[col_name] in [col_type], --> X_RE out integer, X_MSG out varchar2) is V_COUNT integer; begin --新增数据 insert into [table_name](<!--[col_name][,]-->) values(SEQ_EXAM_QUESTION.Nextval<!--[,]-->); X_RE := 1; X_MSG := '提示:新增成功!'; commit; exception when others then rollback; X_RE := 9; X_MSG := '操作失败:['||sqlcode||':'||sqlerrm||']'; dbms_output.put_line('异常提示:'||sqlcode||':'||sqlerrm); end; /***************************************** -- create by: zhyongfeng -- create date: [create_time] -- fun:编辑 <!-- -- P_[col_name]:[col_comment] --> -- X_RE:输出 -- X_MSG:输出 *****************************************/ procedure [table_name]_Edit( <!-- P_[col_name] in [col_type], --> X_RE out integer, X_MSG out varchar2) is V_COUNT integer; begin --更新数据 update [table_name] set <!-- [col_name]= P_[col_comment][,] --> where 1=1; X_RE := 1; X_MSG := '提示:更新成功!'; commit; exception when others then rollback; X_RE := 9; X_MSG := '操作失败:['||sqlcode||':'||sqlerrm||']'; dbms_output.put_line('异常提示:'||sqlcode||':'||sqlerrm); end; /***************************************** -- create by: zhyongfeng -- create date: [create_time] -- fun: 删除 -- 编号:编号 -- X_RE:输出 -- X_MSG:输出 *****************************************/ procedure [table_name]_Delete(编号 in number, X_RE out integer, X_MSG out varchar2) is V_COUNT integer; begin --删除 delete from [table_name] where 编号=编号; X_RE := 1; X_MSG := '提示:删除成功!'; commit; exception when others then rollback; X_RE := 9; X_MSG := '操作失败:['||sqlcode||':'||sqlerrm||']'; dbms_output.put_line('异常提示:'||sqlcode||':'||sqlerrm); end;
三 效果演示
四 总结
原理比较简单,主要通过自己制定一些可识别的字符串,并进行正则匹配,生成相应的目标代码。这样子做的好处是:
在编写数据库包、触发器、存储过程中,均可以提高编写代码效率、提高编写代码的准确度。
在Web UI or DotNet众多技术框架中,实现了以数据库为主,代码字段or对象实例的动态创建,节约了开发者的时间和效率。
五 源代码提供
5.1、运行环境
系统:win7/windows xp
IDE工具:VS2008
版本:.net framework3.5
5.2、源代码
源代码下载:https://files.cnblogs.com/yongfeng/OracleDataBase_Object_Creater.rar
可执行文件:https://files.cnblogs.com/yongfeng/OracleTemplateCodeCreater.rar
视频预览:http://v.youku.com/v_show/id_XNDk4MjIwNzIw.html
注意:需要设置一下OracleDataBase_Object_Create.exe.config的Oracle数据库数据源,否则连接不上数据库,里面有源代码、执行文件。