现在的位置: 首页 > 综合 > 正文

浅谈代码生成器–附源码

2012年09月01日 ⁄ 综合 ⁄ 共 7405字 ⁄ 字号 评论关闭

  好长时间又没写文章了,发觉没什么自己好写的,技术方面的文章cnblogs每天出的太多了,没事翻看了下自己以前搞过的东西发觉每次项目前期都要用代码生成器来生成一些现成的代码,就来谈谈这个代码生成器吧,我相信基本很多程序员都有写过,说实话就是为了更好的偷懒(呵呵)。第上我的界面,很粗糙,自己用嘛够了!
平台:win7 +vs 2010+sql 2008 

源码地址:http://files.cnblogs.com/Royal_WH/代码生成器.rar

  

看一下解决方案管理器,很简单就二个项目:

Writer类就是用来生成代码的,那个SqlDataBase其实只提供一个数据库连接。 

其实用到SqlDataBase里就两个函数:

/// <summary>
/// 获取数据源所有表信息
/// </summary>
/// <returns>返回DateTable对象</returns>
public DataTable GetTables(string sql)
{
Open();
DataTable schemaTable;
cmd
= new SqlCommand(sql, cn);

sdr
= cmd.ExecuteReader(CommandBehavior.SchemaOnly);

schemaTable
= sdr.GetSchemaTable();
Close();
return schemaTable;
}

/// <summary>
/// 获取数据库所有表名
/// </summary>
/// <returns></returns>
public DataTable Getcolumn()
{
Open();
DataTable dt;
dt
= GetTable("select name from sysobjects where type ='U'");
Close();
return dt;
}

Writer类中的方法就比较多了:

编写实体类的代码,最简单:

/// <summary>
/// 编写实体类 -> Model
/// </summary>
/// <param name="namespaces"></param>
/// <param name="projectname"></param>
/// <param name="classname"></param>
/// <param name="name"></param>
public string GetModelCode(DataTable dt, string namespaces, string projectname, string classname, string name)
{
try
{
dt
= ClearHeard(dt);
StringBuilder str
= new StringBuilder();
str.Append(
"using System;" + Environment.NewLine + "" +
Environment.NewLine
+ "");

str.Append(
"namespace " + namespaces + "." + projectname);
str.Append(
"" + Environment.NewLine + "{" + Environment.NewLine + "");
str.Append(
" /// <summary>" + Environment.NewLine
+ " /// 实体类 " + classname + " " + Environment.NewLine
+ " /// 编写者:" + name + " " + Environment.NewLine
+ " /// 日期:" + DateTime.Now + "" + Environment.NewLine 
+ " /// </summary>" + Environment.NewLine + "");
str.Append(
" public class " + classname
+ "" + Environment.NewLine + "" + " {" + Environment.NewLine + "");
for (int i = 0; i < dt.Rows.Count; i++)
{

if (conver(dt.Rows[i][2].ToString()) == "string")
{
str.Append(
" private "
+ conver(dt.Rows[i][2].ToString()) + " " + dt.Rows[i][0].ToString().ToLower()
+ "=string.Empty" + ";" + Environment.NewLine + "");
}
else if (conver(dt.Rows[i][2].ToString()) == "Guid")
{
str.Append(
" private "
+ conver(dt.Rows[i][2].ToString()) + " " + dt.Rows[i][0].ToString().ToLower()
+ "=Guid.Empty" + ";" + Environment.NewLine + "");
}
else
{
str.Append(
" private "
+ conver(dt.Rows[i][2].ToString()) + " " + dt.Rows[i][0].ToString().ToLower() 
+ "=" + conver(dt.Rows[i][2].ToString()) + ".MaxValue;" + Environment.NewLine + "");
}
}
for (int i = 0; i < dt.Rows.Count; i++)
{
str.Append(
"" + Environment.NewLine
+ " /// <summary>" + Environment.NewLine + " /// "
+ dt.Rows[i][0].ToString() + "" + Environment.NewLine + " /// </summary>"
+ Environment.NewLine + "");
str.Append(
" public "
+ conver(dt.Rows[i][2].ToString()) + " " + dt.Rows[i][0].ToString() + "" 
+ Environment.NewLine + "");
str.Append(
" {" + Environment.NewLine
+ " set{" + dt.Rows[i][0].ToString().ToLower() + "=value;}" 
+ Environment.NewLine + "");
str.Append(
" get{ return " 
+ dt.Rows[i][0].ToString().ToLower() + ";}" + Environment.NewLine
+ " }" + Environment.NewLine + "");
}

str.Append(
" }" + Environment.NewLine 
+ "}" + Environment.NewLine + "" + Environment.NewLine + "");
return str.ToString();
}
catch { }
return "出错了";
}

那个dt里的数据是我们从数据库里读出来的表头的信息和表结构的所有信息,里面有很多信息但我们只要一部分,所以我们把其它列的信息去掉:

    /// <summary>
/// 清除数据库表头
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public DataTable ClearHeard(DataTable dt)
{
dt.Columns.Remove(
"NumericScale");
dt.Columns.RemoveAt(
1);
dt.Columns.Remove(
"NumericPrecision");
dt.Columns.Remove(
"IsUnique");
dt.Columns.Remove(
"IsKey");
dt.Columns.Remove(
"BaseServerName");
dt.Columns.Remove(
"BaseCatalogName");
dt.Columns.Remove(
"BaseSchemaName");
dt.Columns.Remove(
"BaseTableName");
dt.Columns.Remove(
"AllowDBNull");
dt.Columns.Remove(
"ProviderType");
dt.Columns.Remove(
"IsAliased");
dt.Columns.Remove(
"IsExpression");
dt.Columns.Remove(
"IsIdentity");
dt.Columns.Remove(
"IsAutoIncrement");
dt.Columns.Remove(
"IsRowVersion");
dt.Columns.Remove(
"IsHidden");
dt.Columns.Remove(
"IsReadOnly");
dt.Columns.Remove(
"ProviderSpecificDataType");
dt.Columns.Remove(
"XmlSchemaCollectionDatabase");
dt.Columns.Remove(
"XmlSchemaCollectionOwningSchema");
dt.Columns.Remove(
"XmlSchemaCollectionName");
dt.Columns.Remove(
"UdtAssemblyQualifiedName");
dt.Columns.Remove(
"IsLong");
dt.Columns.Remove(
"DataType");
dt.Columns.Remove(
"NonverSionedProviderType");
dt.Columns.Remove(
"BaseColumnName");
return dt;
}

我们来看下从数据库读取出来的dt的信息:

第一行是我表里所有属性,然后是列序,大小等等。上面的ClearHeard函数就是把我们不用的去掉。
我们看一下生成好的实体类的代码:

using System;

namespace Thunder.
{
/// <summary>
/// 实体类 ProjectModel
/// 编写者:Royal_WH
/// 日期:2011-02-21 15:10:25
/// </summary>
public class ProjectModel
{
private Guid projectid=Guid.Empty;
private string projectno=string.Empty;
private string constructname=string.Empty;
private string address=string.Empty;
private string contact=string.Empty;
private string tel=string.Empty;
private string projectname=string.Empty;
private string projectaddress=string.Empty;
private double area=double.MaxValue;
private int buildings=int.MaxValue;
private string projectnature=string.Empty;
private string regional=string.Empty;
private decimal bepay=decimal.MaxValue;
private decimal reducepay=decimal.MaxValue;
private string reducenumber=string.Empty;
private decimal betopay=decimal.MaxValue;
private decimal topay=decimal.MaxValue;
private string designunitname=string.Empty;
private string dcontact=string.Empty;
private string dtel=string.Empty;
private string constructunitname=string.Empty;
private string ccontact=string.Empty;
private string ctel=string.Empty;
private string supervisionunitname=string.Empty;
private string scontact=string.Empty;
private string stel=string.Empty;

/// <summary>
/// ProjectID
/// </summary>
public Guid ProjectID
{
set{projectid=value;}
get{ return projectid;}
}

/// <summary>
/// ProjectNo
/// </summary>
public string ProjectNo
{
set{projectno=value;}
get{ return projectno;}
}

/// <summary>
/// ConstructName
/// </summary>
public string ConstructName
{
set{constructname=value;}
get{ return constructname;}
}

/// <summary>
/// Address
/// </summary>
public string Address
{
set{address=value;}
get{ return address;}
}

/// <summary>
/// Contact
/// </summary>
public string Contact
{
set{contact=value;}
get{ return contact;}
}

/// <summary>
/// Tel
/// </summary>
public string Tel
{
set{tel=value;}
get{ return tel;}
}

/// <summary>
/// ProjectName
/// </summary>
public string ProjectName
{
set{projectname=value;}
get{ return projectname;}
}

/// <summary>
/// ProjectAddress
/// </summary>
public string ProjectAddress
{
set{projectaddress=value;}
get{ return projectaddress;}
}

/// <summary>
/// Area
/// </summary>
public double Area
{
set{area=value;}
get{ return area;}
}

/// <summary>
/// Buildings
/// </summary>
public int Buildings
{
set{buildings=value;}
get{ return buildings;}
}

/// <summary>
/// ProjectNature
/// </summary>
public string ProjectNature
{
set{projectnature=value;}
get{ return projectnature;}
}

/// <summary>
/// Regional
/// </summary>
public string Regional
{
set{regional=value;}
get{ return regional;}
}

/// <summary>
/// BePay
/// </summary>
public decimal BePay
{
set{bepay=value;}
get{ return bepay;}
}

/// <summary>
/// ReducePay
/// </summary>
public decimal ReducePay
{
set{reducepay=value;}
get{ return reducepay;}
}

/// <summary>
/// ReduceNumber
/// </summary>
public string ReduceNumber
{
set{reducenumber=value;}
get{ return reducenumber;}
}

/// <summary>
/// BeToPay
/// </summary>
public decimal BeToPay
{
set{betopay=value;}
get{ return betopay;}
}

/// <summary>
/// ToPay
/// </summary>
public decimal ToPay
{
set{topay=value;}
get{ return topay;}
}

/// <summary>
/// DesignUnitName
/// </summary>
public string DesignUnitName
{
set{designunitname=value;}
get{ return designunitname;}
}

/// <summary>
/// DContact
/// </summary>
public string DContact
{
set{dcontact=value;}
get{ return dcontact;}
}

/// <summary>
/// DTel
/// </summary>
public string DTel
{
set{dtel=value;}
get{ return dtel;}
}

/// <summary>
/// ConstructUnitName
/// </summary>
public string ConstructUnitName
{
set{constructunitname=value;}
get{ return constructunitname;}
}

/// <summary>
/// CContact
/// </summary>
public string CContact
{
set{ccontact=value;}
get{ <

抱歉!评论已关闭.