---恢复内容开始---
代码生成器的原理很简单,就是通过读取数据库的表结构,根据读取到的数据组合成代码,一个最基础的代码生成器有以下几点
一 生成器界面,我用的是winform,界面如图
第一行是数据库链接字符串,点击右边的测试连接,就可以测试数据库链接字符串是否正确。
如果测试链接成功后,自动抓取数据库的所有表,将表名抓取到表名的下拉框中,表名的下拉框也变成可编辑的,右侧的主键的下拉框,也会默认抓取左侧表的主键。
点击【生成代码】按钮,生成代码到下面的文本框中
点击【生成文件】按钮,生成代码到对应的cs文件下,文件路径为保存路径加表名
二 代码解释
1.抓取数据库中所有的表,核心代码如下:
//获得数据库所有表名 string sql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'"; dt = ResultDataTable(sql); //表名 string[] tables = new string[dt.Rows.Count]; for (int i = 0; i < dt.Rows.Count; i++) { DataRow row = dt.Rows[i]; tables[i] = (string)row["TABLE_NAME"]; } //把表名放在下拉框中 cmbTables.DataSource = tables; cmbTables.SelectedIndex = 0;
ResultDataTable方法如下:
public DataTable ResultDataTable(string sql, params SqlParameter[] parameters) { using (SqlConnection connstr = new SqlConnection(txtConnStr.Text)) { //打开数据库连接 connstr.Open(); using (SqlCommand command = connstr.CreateCommand()) { command.CommandText = sql; command.Parameters.AddRange(parameters); SqlDataAdapter sda = new SqlDataAdapter(command); DataSet ds = new DataSet(); //获取表中的全部信息(如填充每个表中的主键和外键等) sda.FillSchema(ds, SchemaType.Source); sda.Fill(ds); return ds.Tables[0]; } } }
2.生成代码到文本框中,先通过表名获取表的所有列,然后根据所有的列生成代码
//获取表名 string tableName = cmbTables.SelectedValue.ToString(); //获取字段名 DataColumnCollection columns = Returncolumns(tableName); //将生成的代码填入文本框中 txtCode.Text = CreateModelCode(columns);
根据表名返回表中所有列名的方法Returncolumns
/// <summary> /// 返回数据表列名 /// </summary> /// <param name="tablename">表名</param> /// <returns></returns> public DataColumnCollection Returncolumns(string tablename) { DataTable datatable = ResultDataTable("select top 0 * from " + tablename); DataColumnCollection columns = datatable.Columns; return columns; }
根据列名生成代码的方法CreateModelCode()。这个方法是生成的实体类,因为生成实体类最简单,所以用这个做例子。。。
/// <summary> /// 生成Model代码 /// </summary> /// <param name="columns"></param> public string CreateModelCode(DataColumnCollection columns) { StringBuilder sb = new StringBuilder(); sb.Append("public class ").AppendLine(cmbTables.SelectedValue.ToString()).AppendLine("{"); foreach (DataColumn column in columns) { sb.Append(" public ").Append(ColumnType(column)).Append(" ");//例如 public string sb.Append(column.ColumnName); //例如 public string Id sb.AppendLine(" { get; set; }");//例如 public string Id { get; set;} } sb.Append("}"); return sb.ToString(); }
3.生成代码到CS文件中,实现方式跟输入到文本框中是一样的,只不过最后一步是生成一个新的文件,主要代码:
//判断文件目录是否存在 string directory = txtDir.Text.Trim(); if (string.IsNullOrWhiteSpace(directory)) { MessageBox.Show("请输入文件地址"); return; } if (!Directory.Exists(directory)) { MessageBox.Show("路径不对,请重新输入"); } string tableName = cmbTables.SelectedValue.ToString(); DataColumnCollection columns = Returncolumns(tableName); string fileName = tableName + ".cs"; string filePath = directory + "\\" + fileName; string fileStr = CreateModelCode(columns); try { MyCommonTools.WriteToFile(filePath, fileStr, true); MessageBox.Show("生成成功"); } catch (Exception exception) { MessageBox.Show("生成代码出错"); throw exception; }
WriteToFile()方法代码在下面:
/// <summary> /// 将字符串写入到文件中 /// </summary> /// <param name="filePath">文件的实际路径</param> /// <param name="content">内容</param> /// <param name="isCover">是否覆盖,true就是重新写一遍,false就是往里面添加内容</param> public static void WriteToFile(string filePath, string content, bool isCover) { FileStream fs = null; try { if (!isCover && System.IO.File.Exists(filePath)) { fs = new FileStream(filePath, FileMode.Append, FileAccess.Write); StreamWriter sw = new StreamWriter(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