随笔-82  评论-920  文章-0  trackbacks-56

关于能自定义格式的、支持多语言的、支持多数据库的代码生成器的想法

我的上个随笔提到我的代码生成器,已经可以生成用SQL语句操作数据库库,用存储过程操作数据库(并同时生成存储过程),和对数据进行映射。

我一直在努力想将他扩展成多种格式,语言,多数据库支持的。但我发现每种新格式必须新写不少代码,麻烦,而且格式只能写死在代码里。

大前天,我突然想到,为什么不设置一个格式文件通过解析格式生成代码呢,这样用户在拓展生成格式的时候只需要写个格式文件就可以了,跨语言,跨格式一步实现。

实现如下:

标识
<<TABLE_NAME>>         表名
<<U_TABLE_NAME>> 全部大写的表名
<<L_TABLE_NAME>> 全部小写的表名
<<UF_TABLE_NAME>> 首字母大写的表名
<<LF_TABLE_NAME>>       首字母小写的表名
<<COLUMN_NAME>>         列名
<<U_COLUMN_NAME>> 全部大写的列名
<<L_COLUMN_NAME>> 全部小写的列名
<<UF_COLUMN_NAME>> 首字母大写的列名
<<LF_COLUMN_NAME>>      首字母小写的列名
<<COLUMN_SIZE>>         列长度
<<COLUMN_TYPE>>         列类型
<<COLUMN_VALUE_TYPE>>   对应的数据类型
<<COLUMN_DB_Type>> 对应的数据库参数类型


命令
<<FOREACH_COLUMN>> <<END_FOREACH_COLUMN>> 在所有的字段循环
<<FOREACH_PKCOLUMN>>  <<END_FOREACH_PKCOLUMN>> 在所有的关键字段循环
<<REMOVE_COMMA>> <<END_REMOVE_COMMA>>  去掉最后的逗号

下面是我写的一个格式

 

using System;
using System.Data;
using System.Data.SqlClient;

namespace 命名空间
{
    
/// </summary>
    
///注释
    
/// </summary>

    public class <<TABLE_NAME>>DB
    
{
        
private SqlConnection conn=new SqlConnection();
        
private SqlCommand command=new SqlCommand();

        
public <<TABLE_NAME>>DB()
        
{
            conn.ConnectionString
=ConStrLib.GetConStr();
        }


        
<<FOREACH_COLUMN>>
        
private <<COLUMN_VALUE_TYPE>> <<LF_COLUMN_NAME>>;
        
public <<COLUMN_VALUE_TYPE>> <<UF_COLUMN_NAME>>
        
{
            
get
            
{
                
return <<LF_COLUMN_NAME>>;
            }

            
set
            
{
                
<<LF_COLUMN_NAME>>= value ;
            }

        }


        
<<END_FOREACH_COLUMN>>

        
        
public bool Add()
        
{
            
string strSql = "insert into <<TABLE_NAME>>
            (<<REMOVE_COMMA>><<FOREACH_COLUMN>><<COLUMN_NAME>>,<<END_FOREACH_COLUMN>><<END_REMOVE_COMMA>>)"
                +"values(@AdminID, @PassWord)" ;
            SqlCommand command 
= new SqlCommand(strSql,conn) ;

            
<<FOREACH_COLUMN>>
            command.Parameters.Add(
"@<<COLUMN_NAME>>",<<COLUMN_DB_Type>>) ;
            command.Parameters[
"@<<COLUMN_NAME>>"].Value = <<LF_COLUMN_NAME>>;
            
<<END_FOREACH_COLUMN>>

            
try
            
{
                conn.Open() ;
                command.ExecuteNonQuery() ;
                
return true ;
            }

            
catch(Exception e)
            
{
                
throw(new Exception("Error in the Database"+e.Message)) ;
            }

            
finally
            
{
                conn.Close() ;
            }

        }


        
public bool Modify()
        
{
            
string strSql ="update <<TABLE_NAME>> set <<REMOVE_COMMA>><<FOREACH_COLUMN>><<COLUMN_NAME>> = 

@
<<COLUMN_NAME>>,<<END_FOREACH_COLUMN>><<END_REMOVE_COMMA>> "
                + " where <<REMOVE_COMMA>><<FOREACH_PKCOLUMN>><<COLUMN_NAME>> = 

@
<<COLUMN_NAME>>,<<END_FOREACH_PKCOLUMN>><<END_REMOVE_COMMA>>";
        
            SqlCommand command 
= new SqlCommand(strSql,conn) ;
        
            
<<FOREACH_COLUMN>>
            command.Parameters.Add(
"@<<COLUMN_NAME>>",<<COLUMN_DB_Type>>) ;
            command.Parameters[
"@<<COLUMN_NAME>>"].Value = <<LF_COLUMN_NAME>>;
            
<<END_FOREACH_COLUMN>>
        
            
try
            
{
                conn.Open() ;
                command.ExecuteNonQuery() ;
                
return true ;
            }

            
catch(Exception e)
            
{
                
throw(new Exception("Error in the Database"+e.Message)) ;
            }

            
finally
            
{
                conn.Close() ;
            }

        }


        
public bool Delete()
        
{
            
string strSql ="delete from <<TABLE_NAME>>"
                
+ " where <<REMOVE_COMMA>><<FOREACH_PKCOLUMN>><<COLUMN_NAME>> = 

@
<<COLUMN_NAME>>,<<END_FOREACH_PKCOLUMN>><<END_REMOVE_COMMA>>";
        
            SqlCommand command 
= new SqlCommand(strSql,conn) ;
        
            
<<FOREACH_PKCOLUMN>>
            command.Parameters.Add(
"@<<COLUMN_NAME>>",<<COLUMN_DB_Type>>) ;
            command.Parameters[
"@<<COLUMN_NAME>>"].Value = <<LF_COLUMN_NAME>>;
            
<<END_FOREACH_PKCOLUMN>>
        
            
try
            
{
                conn.Open() ;
                command.ExecuteNonQuery() ;
                
return true ;
            }

            
catch(Exception e)
            
{
                
throw(new Exception("Error in the Database"+e.Message)) ;
            }

            
finally
            
{
                conn.Close() ;
            }

        }

生成的代码如下

using System;
using System.Data;
using System.Data.SqlClient;

namespace 命名空间
{
    
/// </summary>
    
///注释
    
/// </summary>

    public class AdminDB
    
{
        
private SqlConnection conn=new SqlConnection();
        
private SqlCommand command=new SqlCommand();

        
public AdminDB()
        
{
            conn.ConnectionString
=ConStrLib.GetConStr();
        }


        
        
private string adminID;
        
public string AdminID
        
{
            
get
            
{
                
return adminID;
            }

            
set
            
{
                adminID
= value ;
            }

        }


        
        
private string passWord;
        
public string PassWord
        
{
            
get
            
{
                
return passWord;
            }

            
set
            
{
                passWord
= value ;
            }

        }


        

        
        
public bool Add()
        
{
            
string strSql = "insert into Admin
            (AdminID,PassWord)"
                +"values(@AdminID, @PassWord)" ;
            SqlCommand command 
= new SqlCommand(strSql,conn) ;

            
            command.Parameters.Add(
"@AdminID",SqlDbType.Char) ;
            command.Parameters[
"@AdminID"].Value = adminID;
            
            command.Parameters.Add(
"@PassWord",SqlDbType.VarChar) ;
            command.Parameters[
"@PassWord"].Value = passWord;
            

            
try
            
{
                conn.Open() ;
                command.ExecuteNonQuery() ;
                
return true ;
            }

            
catch(Exception e)
            
{
                
throw(new Exception("Error in the Database"+e.Message)) ;
            }

            
finally
            
{
                conn.Close() ;
            }

        }


        
public bool Modify()
        
{
            
string strSql ="update Admin set AdminID = @AdminID,PassWord = @PassWord "
                
+ " where AdminID = @AdminID";
        
            SqlCommand command 
= new SqlCommand(strSql,conn) ;
        
            
            command.Parameters.Add(
"@AdminID",SqlDbType.Char) ;
            command.Parameters[
"@AdminID"].Value = adminID;
            
            command.Parameters.Add(
"@PassWord",SqlDbType.VarChar) ;
            command.Parameters[
"@PassWord"].Value = passWord;
            
        
            
try
            
{
                conn.Open() ;
                command.ExecuteNonQuery() ;
                
return true ;
            }

            
catch(Exception e)
            
{
                
throw(new Exception("Error in the Database"+e.Message)) ;
            }

            
finally
            
{
                conn.Close() ;
            }

        }


        
public bool Delete()
        
{
            
string strSql ="delete from Admin"
                
+ " where AdminID = @AdminID";
        
            SqlCommand command 
= new SqlCommand(strSql,conn) ;
        
            
            command.Parameters.Add(
"@AdminID",SqlDbType.Char) ;
            command.Parameters[
"@AdminID"].Value = adminID;
            
        
            
try
            
{
                conn.Open() ;
                command.ExecuteNonQuery() ;
                
return true ;
            }

            
catch(Exception e)
            
{
                
throw(new Exception("Error in the Database"+e.Message)) ;
            }

            
finally
            
{
                conn.Close() ;
            }

        }

哈哈,挺不错,现在我这个工具还在编码中,如果完成会马上通知大家,并公布代码。望多多指教。

 

 

0
0
(请您对文章做出评价)
« 上一篇:自动代码生成器
» 下一篇:几个正则表达式的小工具
posted on 2004-08-31 11:04 DDL 阅读(2032) 评论(9)  编辑 收藏 所属分类: 代码生成

评论:
#1楼 2004-08-31 12:26 | progame
http://progame.vip.myrice.com:81/ceg/

我很久以前做的一个东西

(当然现在我还在用)

  回复  引用    
#2楼 2004-08-31 12:27 | birdshome

嗯,好想法~

这是我做的 SQL2C#

http://www.cnblogs.com/birdshome/archive/2004/08/27/36998.aspx


  回复  引用    
#3楼 2004-08-31 15:59 | DDL
to progame:
我看里你写的ceg
的确是个好东西,如果能把代码公布出来那就太感谢了

  回复  引用    
#4楼 2005-04-30 12:21 | codemaker[未注册用户]
这是我做的软件,名称:CodeMaker 自动化的代码生成工具

网址:www.mhua.com

老兄有时间来看看. 不过你的软件的名称和我的是一样的。 而且我的软件已经商业化了。 哎~~~

  回复  引用    
#5楼 2005-10-25 19:40 | lorryfang[未注册用户]
正在学习中,但是一点头绪都没有.都搞不清楚该从哪里下手,希望得到前辈们的指点.
  回复  引用    
#6楼[楼主] 2005-10-27 09:15 | DDL      
在我有了上面的想法后,突然有一天我发现MyGeneration(http://www.mygenerationsoftware.com/),这个工具的做法和我的想法出奇的一致,把的想法已经很完美的实现了。既然已经存在现成的产品,而且是免费的,所以我放弃了自己做此代码生成器的方法。
  回复  引用  查看    
#7楼 2005-12-22 08:36 | ccfish[未注册用户]
来这里看看吧。 已经有人完成了。 http://www.mhua.com
  回复  引用    
#8楼 2006-07-25 11:40 | 假山看月[未注册用户]
好东西不敢独享,吐血推荐:

http://macrobject.com/cn/CodeAuto/Index.htm

  回复  引用