zoukankan      html  css  js  c++  java
  • 摆脱CodeSmith,使用页面生成.CS文件

             大家好,首先我要声明的是:本人不曾对CodeSmith有过任何偏见,相反,在以后我做的几个项目中,
    曾大量使用它来生成一些代码。但是由于本人最近在研究IOC类型框架Castle时,为了生成符合我要求的
    数据表类型CS文件,发现去定义自己的CodeSmith模版太麻烦了,因此动了使用网页ASPX生成CS文件的念
    头[可能有点BT],但是在完成这个程序后发现,这个东西非常好用。虽然目前只能进行SQLSERVER2000数
    据库文件生成,但相信扩展到其它数据库类型并不难,但由于本人精力有限,目前只能做到此步。相信
    有使用ORACLE,MYSQL等数据库的朋友完善它。
             闲话少叙,马上开说。

             如何找出当前数据库中的所有表字段和类型,有许多的方法,本人只用最常用的SQL语句来完成,如
    下:

      SELECT 表名=case when a.colorder=1 then d.name else '' end,
         表说明=case when a.colorder=1 then isnull(f.value,'') else '' end,
        字段序号=a.colorder,
         字段名=a.name,
          标识=case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else '' end,
          主键=case when exists(SELECT 1 FROM sysobjects where xtype='PK' and name in ( SELECT name FROM sysindexes WHERE indid in( SELECT indid FROM sysindexkeys WHERE id = a.id AND colid=a.colid ))) then '√' else '' end,
          类型=b.name,
       占用字节数=a.length,
          长度=COLUMNPROPERTY(a.id,a.name,'PRECISION'),
        小数位数=isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0),
         允许空=case when a.isnullable=1 then '√'else '' end,
         默认值=isnull(e.text,''),
        字段说明=isnull(g.[value],'')FROM syscolumns a left join systypes b on a.xtype=b.xusertype inner join sysobjects d on a.id=d.id and d.xtype='U' and d.name<>'dtproperties' left join syscomments e on a.cdefault=e.id left join sysproperties g on a.id=g.id and a.colid=g.smallid left join sysproperties f on d.id=f.id and f.smallid=0 order by a.id,a.colorder

    得到了相应的信息之后,开始生成CS文件,相关函数代码如下:

      1 //写入接口文件内容
      2        public string InterFaceFileContent(string TableName,string TableField)
      3        {
      4            string talbefield=null;
      5            foreach(string m_tablefield in TableField.Split(';'))
      6            {
      7                if (m_tablefield.Trim()!="")   talbefield+= m_tablefield+"{get;set;}\r\n    ";
      8            }

      9
     10            StringBuilder content=new StringBuilder();
     11            content.Append("using System;\r\n");
     12            content.Append("using System.Data;\r\n");
     13            content.Append("\r\n");
     14            content.Append("namespace Entity\r\n");
     15            content.Append("{\r\n  ");
     16            content.Append("/// <summary>\r\n  ");
     17            content.Append("/// Entity 的摘要说明。\r\n  ");
     18            content.Append("/// </summary>\r\n  ");
     19            content.Append("public interface I"+TableName+"Entity\r\n  ");
     20            content.Append("{\r\n    ");
     21            content.Append(talbefield+"\r\n  ");
     22            content.Append("}\r\n\r\n  ");
     23        
     24            content.Append("public interface IDao_"+TableName+"Entity\r\n  ");
     25            content.Append("{\r\n    ");
     26            content.Append(string.Format("I{0}Entity Insert(I{0}Entity dse);\r\n    ",TableName));
     27            content.Append(string.Format("I{0}Entity Update(I{0}Entity dse);\r\n    ",TableName));
     28            content.Append("void Delete(string Condition);\r\n    ");
     29            content.Append("DataTable Find(string SqlString);\r\n    ");
     30            content.Append(string.Format("I{0}Entity Find(int id);\r\n  ",TableName));
     31            content.Append("}\r\n");
     32            content.Append("}\r\n");
     33            return content.ToString();
     34        }

     35
     36
     37                //写入实体文件内容
     38        public string EntityFileContent(string TableName,string TableField)
     39        {
     40            string tablefield=null;
     41            string tablefieldname=null//字段名,例:ID,NAME
     42            string insertvaluetablefield=null;  //例如:ie.ID,ie.Name
     43            string insertvaluetableindex=null;  //例如:'{1}','{2}';
     44            string updatevaluetablefield=null;  //例如:ID='{0}',Name='{1}'
     45            string createfunction=null//重载构造函数体
     46            int i=0;
     47
     48            //拼接出符合上面变量格式的字符串
     49            foreach(string m_tablefield in TableField.Split(';'))
     50            {
     51                if (m_tablefield.Trim()!="")
     52                {
     53                    StringBuilder field=new StringBuilder();
     54                    field.Append("private "+m_tablefield.Replace(" "," m_")+";\r\n    ");
     55                    field.Append(string.Format("public {0}\r\n    ",m_tablefield));
     56                    field.Append("{\r\n        ");
     57                    field.Append("get { return m_"+m_tablefield.Split(' ')[1]+"; }\r\n        ");
     58                    field.Append("set { m_"+m_tablefield.Split(' ')[1]+" = value; }\r\n    ");
     59                    field.Append("}\r\n  ");
     60        
     61                    tablefield+= field.ToString()+"\r\n    ";
     62
     63                    tablefieldname+=m_tablefield.Split(' ')[1]+",";
     64                    insertvaluetablefield+="ie."+m_tablefield.Split(' ')[1]+",";
     65                    insertvaluetableindex+="'{"+i.ToString()+"}',";
     66                    updatevaluetablefield+=m_tablefield.Split(' ')[1]+"='{"+i.ToString()+"}',";
     67
     68                    createfunction+="m_"+m_tablefield.Split(' ')[1]+"="+m_tablefield.Split(' ')[1]+";\r\n      ";
     69
     70                    i++;
     71                }

     72            }

     73            //去掉尾部的‘,’号
     74            tablefieldname=tablefieldname.Substring(0,tablefieldname.Length-1);
     75            insertvaluetablefield=insertvaluetablefield.Substring(0,insertvaluetablefield.Length-1);
     76            insertvaluetableindex=insertvaluetableindex.Substring(0,insertvaluetableindex.Length-1);
     77            updatevaluetablefield=updatevaluetablefield.Substring(0,updatevaluetablefield.Length-1);
     78
     79            StringBuilder content=new StringBuilder();
     80            //实体类写入
     81                
    118      
    119            //实体操作类写入
    120            
    167
    168            return content.ToString();
    169        }

    170
    171
    172然后用如下代码调用上面的两个函数
    173
    174public void WriteCS_File(string TableName,string TableField)
    175        {
    176            //写入接口文件
    177            using(FileStream fs = File.Create(Server.MapPath("Test/"+TableName+"_Interface.cs"), 1024))
    178            {
    179                Byte[] info = new UTF8Encoding(true).GetBytes(InterFaceFileContent(TableName,TableField));
    180                // 向文件写信息
    181                fs.Write(info, 0, info.Length);
    182                fs.Close();
    183            }

    184
    185            //写入实体文件
    186            using(FileStream fs = File.Create(Server.MapPath("Test/"+TableName+"_Entity.cs"), 1024))
    187            {
    188                Byte[] info = new UTF8Encoding(true).GetBytes(EntityFileContent(TableName,TableField));
    189                // 向文件写信息
    190                fs.Write(info, 0, info.Length);
    191                fs.Close();
    192            }

    193        }

    194
    195
    代码写的比较乱,没时间整理,望大家见谅。
     源代码
  • 相关阅读:
    easyui里弹窗的两种表现形式
    如何获得 request, "request.getSession(true).setAttribute("a",a);"与“request.setAttribute("a",a);”区别
    JSTL和EL的区别
    windows下安装多个tomcat服务
    谷歌浏览器控制台使用
    递归和迭代有什么区别?
    left join ,right join ,inner join ,cross join 区别
    sql良好习惯
    添加了一个字段,查询速度突然变慢
    热点账户问题-转
  • 原文地址:https://www.cnblogs.com/daizhj/p/GetRidOfCodeSmith.html
Copyright © 2011-2022 走看看