摆脱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
174 public   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
代码写的比较乱,没时间整理,望大家见谅。
 源代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值