如何写代码生成器

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

---恢复内容开始---

代码生成器的原理很简单,就是通过读取数据库的表结构,根据读取到的数据组合成代码,一个最基础的代码生成器有以下几点

一 生成器界面,我用的是winform,界面如图

第一行是数据库链接字符串,点击右边的测试连接,就可以测试数据库链接字符串是否正确。

如果测试链接成功后,自动抓取数据库的所有表,将表名抓取到表名的下拉框中,表名的下拉框也变成可编辑的,右侧的主键的下拉框,也会默认抓取左侧表的主键。

点击【生成代码】按钮,生成代码到下面的文本框中

点击【生成文件】按钮,生成代码到对应的cs文件下,文件路径为保存路径加表名

二 代码解释

1.抓取数据库中所有的表,核心代码如下:

//获得数据库所有表名stringsql ="SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'";

dt=ResultDataTable(sql);//表名string[] tables =newstring[dt.Rows.Count];for(inti =0; i < dt.Rows.Count; i++)

{

DataRow row=dt.Rows[i];

tables[i]= (string)row["TABLE_NAME"];

}//把表名放在下拉框中cmbTables.DataSource =tables;

cmbTables.SelectedIndex=0;

ResultDataTable方法如下:

publicDataTable ResultDataTable(stringsql,paramsSqlParameter[] parameters)

{using(SqlConnection connstr =newSqlConnection(txtConnStr.Text))

{//打开数据库连接connstr.Open();using(SqlCommand command =connstr.CreateCommand())

{

command.CommandText=sql;

command.Parameters.AddRange(parameters);

SqlDataAdapter sda=newSqlDataAdapter(command);

DataSet ds=newDataSet();//获取表中的全部信息(如填充每个表中的主键和外键等)sda.FillSchema(ds, SchemaType.Source);

sda.Fill(ds);returnds.Tables[0];

}

}

}

2.生成代码到文本框中,先通过表名获取表的所有列,然后根据所有的列生成代码

//获取表名stringtableName =cmbTables.SelectedValue.ToString();//获取字段名DataColumnCollection columns =Returncolumns(tableName);//将生成的代码填入文本框中txtCode.Text = CreateModelCode(columns);

根据表名返回表中所有列名的方法Returncolumns

///<summary>///返回数据表列名///</summary>///<param name="tablename">表名</param>///<returns></returns>publicDataColumnCollection Returncolumns(stringtablename)

{

DataTable datatable= ResultDataTable("select top 0 * from"+tablename);

DataColumnCollection columns=datatable.Columns;returncolumns;

}

根据列名生成代码的方法CreateModelCode()。这个方法是生成的实体类,因为生成实体类最简单,所以用这个做例子。。。

///<summary>///生成Model代码///</summary>///<param name="columns"></param>publicstringCreateModelCode(DataColumnCollection columns)

{

StringBuilder sb=newStringBuilder();

sb.Append("public class").AppendLine(cmbTables.SelectedValue.ToString()).AppendLine("{");foreach(DataColumn columnincolumns)

{

sb.Append("public").Append(ColumnType(column)).Append("");//例如 public stringsb.Append(column.ColumnName);//例如 public string Idsb.AppendLine("{ get; set; }");//例如 public string Id { get; set;}}

sb.Append("}");returnsb.ToString();

}

3.生成代码到CS文件中,实现方式跟输入到文本框中是一样的,只不过最后一步是生成一个新的文件,主要代码:

//判断文件目录是否存在stringdirectory =txtDir.Text.Trim();if(string.IsNullOrWhiteSpace(directory))

{

MessageBox.Show("请输入文件地址");return;

}if(!Directory.Exists(directory))

{

MessageBox.Show("路径不对,请重新输入");

}stringtableName =cmbTables.SelectedValue.ToString();

DataColumnCollection columns=Returncolumns(tableName);stringfileName = tableName +".cs";stringfilePath = directory +"\\"+fileName;stringfileStr =CreateModelCode(columns);try{

MyCommonTools.WriteToFile(filePath, fileStr,true);

MessageBox.Show("生成成功");

}catch(Exception exception)

{

MessageBox.Show("生成代码出错");throwexception;

}

WriteToFile()方法代码在下面:

///<summary>///将字符串写入到文件中///</summary>///<param name="filePath">文件的实际路径</param>///<param name="content">内容</param>///<param name="isCover">是否覆盖,true就是重新写一遍,false就是往里面添加内容</param>publicstaticvoidWriteToFile(stringfilePath,stringcontent,boolisCover)

{

FileStream fs=null;try{if(!isCover &&System.IO.File.Exists(filePath))

{

fs=newFileStream(filePath, FileMode.Append, Fileaccess.Write);

StreamWriter sw=newStreamWriter(fs, Encoding.UTF8);

sw.WriteLine(content);

sw.Flush();

sw.Close();

}else{

System.IO.File.WriteAllText(filePath, content, Encoding.UTF8);

}

}finally{if(fs !=null)

{

fs.Close();

}

}

}

代码:http://files.cnblogs.com/files/qigemingzihaonan/CodeBuilder.rar

这是一个最基础的例子,仅仅能提供一种思路,然后这个例子也是参考了别人的文章,地址在这里:

http://www.cnblogs.com/lishun1005/p/4069223.html?utm_source=tuicool

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航