·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> ASP.NET网站开发 >> 如何写代码生成器

如何写代码生成器
作者:佚名      ASP.NET网站开发编辑:admin      更新时间:2022-07-23

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

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

一 生成器界面,我用的是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