zoukankan      html  css  js  c++  java
  • 手写代码生成器

    初来咋到,小试了手写代码生成器,望大牛们指点,下面是成型效果图

    需求:

    1、采用ORM(对象映射关系)模式;

    2、主要解决提供现有表结构,生成Model、DAL层;

    不多说了,下面进入正题

    /// <summary>
            /// 读取文件
            /// </summary>
            /// <param name="fileName">文件名</param>
            /// <returns>返回文件信息</returns>
            private static string GetConfigFilePath(string fileName)
            {
                string currenctDir = AppDomain.CurrentDomain.BaseDirectory;//存放路径
                string configFile = System.IO.Path.Combine(currenctDir, fileName);
                return configFile;
            }
    读取文件

    窗体加载时,读取默认路径连接数据库文件信息

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
            {
                string strcon = File.ReadAllText(GetConfigFilePath("connstr.txt"), Encoding.Default);//字符串以默认标准格式读取
                string[] str = strcon.Split(';');
                for (int i = 0; i < str.Count(); i++)
                {
                    switch (i)
                    {
                        case 0:
                            txtDataSource.Text = str[i].Split('=')[1];//数据库地址
                            break;
                        case 1:
                            txtDatabase.Text = str[i].Split('=')[1];//数据库名称
                            break;
                        case 2:
                            txtUserid.Text = str[i].Split('=')[1];//用户
                            break;
                        case 3:
                            txtPassword.Password = str[i].Split('=')[1];//密码
                            break;
                        default:
                            break;
                    }
                }
            }
    窗体加载

    connstr.txt 文件信息

    data source=10.10.198.111;database=systemconfig;user id=sa;password=sa
     private void btnConnect_Click(object sender, RoutedEventArgs e)
            {
                try
                {
                    //查询所有表名称
                    DataTable table = ExcuteDataTable(@"SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES 
                            WHERE TABLE_TYPE = 'BASE TABLE'");
                    tables = new List<string>();
                    for (int i = 0; i < table.Rows.Count; i++)
                    {
                        DataRow row = table.Rows[i];
                        tables.Add(row["TABLE_NAME"].ToString());
                    }
                    if (tables != null && tables.Count > 0)
                    {
                        cmbTables.ItemsSource = TablesDesc(tables);
                        cmbTables.IsEnabled = true;
                        btnGenerateCode.IsEnabled = true;
                        cmbTables.SelectedIndex = 0;
                    }
                }
                catch (Exception exc)
                {
                    MessageBox.Show("连接失败" + exc.Message);
                    return;
                }
                string configFile = GetConfigFilePath("connstr.txt");
                File.WriteAllText(configFile, strconn);//创建一个新的文件,如果存在则覆盖
            }
    连接数据库
     private void btnGenerateCode_Click(object sender, RoutedEventArgs e)
            {
                string tableName = cmbTables.SelectedItem.ToString();
                if (ckbTable.IsChecked == true)//判断是否指定表生成
                {
                    tableName = txtTableName.Text;
                    if (string.IsNullOrEmpty(tableName))
                    {
                        MessageBox.Show("请输入表名!");
                        return;
                    }
                    else
                    {
                        if (!tables.Contains(tableName))
                        {
                            MessageBox.Show("您输入表名的不存在!");
                            return;
                        }
                    }
                }
                CreatModelCode(tableName);//生成Model文件
                CreatDALCode(tableName);//生成DAL文件
            }
    生成代码
            private void CreatModelCode(string tablename)
            {
                //根据表列名创建Model层属性
                DataTable table = ExcuteDataTable("select top 0 * from " + tablename);
                string Retable = tablename;
                if (tablename.Contains("_"))
                {
                    Retable = tablename.Split('_')[1];
                }
                StringBuilder sb = new StringBuilder();
                sb.AppendLine("using System;");
                sb.AppendLine("using System.Collections.Generic;");
                sb.AppendLine("using System.Text;");
    
                sb.Append("public class ").AppendLine(Retable + "Dto").AppendLine("{");
                foreach (DataColumn item in table.Columns)
                {
                    sb.Append("public ").Append(RemoveSystem(GetDataType(item))).
                        Append(" ").Append(item.ColumnName).AppendLine(" {get;set;}");
                }
                sb.Append("}");
                txtModelCode.Text = sb.ToString();
                string configFile = GetConfigFilePath(Retable + "Dto.cs");//创建ModelDto文件
                File.WriteAllText(configFile, sb.ToString());
            }
    创建Mode层代码
      private DataTable ExcuteDataTable(string sql)
            {
                strconn = @"data source=" + txtDataSource.Text + ";database=" + txtDatabase.Text + ";user id="
                   + txtUserid.Text + ";password=" + txtPassword.Password;
                using (SqlConnection cnn = new SqlConnection(strconn))//连接数据库
                {
                    cnn.Open();
                    using (SqlCommand cmd = cnn.CreateCommand())
                    {
                        cmd.CommandText = sql;//执行sql
                        DataSet dataset = new DataSet();
                        SqlDataAdapter dapter = new SqlDataAdapter(cmd);
                        dapter.FillSchema(dataset, SchemaType.Source);
                        dapter.Fill(dataset);//将dataset添加到SqlDataAdapter容器中
                        return dataset.Tables[0];
                    }
                }
            }
    查询表信息
    /// <summary>
            /// 判断表中列是否为空处理,范围属性类型
            /// </summary>
            /// <param name="column"></param>
            /// <returns></returns>
            private static string GetDataType(DataColumn column)
            {
                if (column.AllowDBNull && column.DataType.IsValueType)
                {
                    return column.DataType + "?";//表字段为空,类属性中添加?
                }
                else
                {
                    return column.DataType.ToString();
                }
            }
    根据表中各列字段类型返回model属性类型
    //该部分可以忽略,主要是看起美观
            /// <summary>
            /// 剔除列类型中包含system.字符串
            /// </summary>
            /// <param name="str"></param>
            /// <returns></returns>
            private static string RemoveSystem(string str)
            {
                if (str.Contains("System."))
                {
                    return str.Replace("System.", "");
                }
                else
                {
                    return str;
                }
            }
    剔除列类型中包含system.字符串
     private void CreatDALCode(string tablename)
            {
                DataTable table = ExcuteDataTable("select top 0 * from " + tablename);
                string Retable = GetTableName(tablename);
                StringBuilder sb = new StringBuilder();
                sb.AppendLine("using System;");
                sb.AppendLine("using System.Collections.Generic;");
                sb.AppendLine("using System.Data;");
                sb.AppendLine("using System.Data.SqlClient;");
    
                sb.Append("public class ").AppendLine(Retable + "DAL").AppendLine("{");
    
                //ToModel
                sb.Append("private static ").Append(Retable + "Dto ").AppendLine("ToModel(DataRow row)").AppendLine("{");
                sb.Append(Retable + "Dto " + "dto").Append("=new ").AppendLine(Retable + "Dto();");
                foreach (DataColumn column in table.Columns)
                {
                    sb.Append("dto.").Append(column.ColumnName).Append("=(")
                      .Append(RemoveSystem(GetDataType(column))).Append(")SqlHelper.FromDbValue(row["")
                     .Append(column.ColumnName).AppendLine(""]);");
                }
                sb.AppendLine("return dto;");
                sb.AppendLine("}");
    
                //查询所有
                sb.Append("public static List<").AppendLine(Retable + "Dto> ListALL()").AppendLine("{");
                sb.Append("List<").AppendLine(Retable + "Dto>  lst=new List<" + Retable + "Dto>();");
                sb.Append("DataTable table = SqlHelper.ExecuteDataTable("select * from ").AppendLine(tablename + "");");
                sb.AppendLine("for (int i = 0; i < table.Rows.Count; i++)");
                sb.AppendLine("{");
                sb.AppendLine(Retable + "Dto dto = ToModel(table.Rows[i]);");
                sb.AppendLine("lst.Add(dto);");
                sb.AppendLine("}");
                sb.AppendLine("return lst;");
                sb.AppendLine("}");
    
                //根据ID获取数据
                sb.Append("public static ").Append(Retable + "Dto ").AppendLine("GetById(string id)");
                sb.AppendLine("{");
                sb.AppendLine("DataTable table = SqlHelper.ExecuteDataTable("select * from " + tablename + " where id=@id", new SqlParameter("@id",id));");
                sb.AppendLine(Retable + "Dto dto=ToModel(table.Rows[0]);");
                sb.AppendLine("return dto;");
                sb.AppendLine("}");
    
                //删除
                sb.AppendLine("public static void Delete(string id)");
                sb.AppendLine("{");
                sb.AppendLine("SqlHelper.ExecuteNonQuery("delete from " + tablename + " where id=@id", new SqlParameter("@id",id));");
                sb.AppendLine("}");
    
                //停用(软删除)
                sb.AppendLine("public static void UnUser(string id)");
                sb.AppendLine("{");
                sb.AppendLine("SqlHelper.ExecuteNonQuery("update " + tablename + "set status=1 where id=@id",new SqlParameter("@id",id));");
                sb.AppendLine("}");
    
                //启用
                sb.AppendLine("public static void User(string id)");
                sb.AppendLine("{");
                sb.AppendLine("SqlHelper.ExecuteNonQuery("update " + tablename + "set status=0 where id=@id",new SqlParameter("@id",id));");
                sb.AppendLine("}");
    
                //新增
                sb.AppendLine("public static void Insert(" + Retable + "Dto dto)");
                sb.AppendLine("{");
                sb.AppendLine("SqlHelper.ExecuteNonQuery("insert into " + tablename + "(" + GetCoulmns(tablename) + ") values (" + GetValues(tablename) + ")"," + GetSqlParameter(tablename, true) + ");");
                sb.AppendLine("}");
    
                //编辑
                sb.AppendLine("public static void Update(" + Retable + "Dto dto)");
                sb.AppendLine("{");
                sb.AppendLine("SqlHelper.ExecuteNonQuery("update " + tablename + "set" + GetUpdateValues(tablename) + " where id=@id"," + GetSqlParameter(tablename, false) + ");");
                sb.AppendLine("}");
                sb.AppendLine("}");
                txtDALCode.Text = sb.ToString();
                string configFile = GetConfigFilePath(Retable + "DAL.cs");
                File.WriteAllText(configFile, sb.ToString());
            }
    生成数据处理层代码
            private string GetUpdateValues(string tablename)
            {
                DataTable table = ExcuteDataTable("select top 0 * from " + tablename);
                string Retable = GetTableName(tablename);
                List<string> strs = new List<string>();
                for (int i = 0; i < table.Columns.Count; i++)
                {
                    if (table.Columns[i].ColumnName.ToLower() != "id" && table.Columns[i].ColumnName.ToLower() != "status")//id、status字段不做更新
                    {
                        strs.Add(table.Columns[i].ColumnName + "=@" + table.Columns[i].ColumnName);
                    }
                }
                return string.Join(",", strs);
            }
    编辑操作,更新列值
            private string GetCoulmns(string tablename)
            {
                DataTable table = ExcuteDataTable("select top 0 * from " + tablename);
                string Retable = GetTableName(tablename);
                List<string> strs = new List<string>();
                for (int i = 0; i < table.Columns.Count; i++)
                {
                    strs.Add(table.Columns[i].ColumnName);
                }
                return string.Join(",", strs);
            }
    获取表中所以列拼接
     private string GetValues(string tablename)
            {
                DataTable table = ExcuteDataTable("select top 0 * from " + tablename);
                string Retable = GetTableName(tablename);
                List<string> strs = new List<string>();
                for (int i = 0; i < table.Columns.Count; i++)
                {
                    if (table.Columns[i].ColumnName == "id")
                    {
                        strs.Add("newid()");
                    }
                    else if (table.Columns[i].ColumnName.ToLower() == "status")
                    {
                        strs.Add("0");
                    }
                    else
                    {
                        strs.Add("@" + table.Columns[i].ColumnName);
                    }
                }
                return string.Join(",", strs);
            }
    获取更新或插入的列值
     private string GetSqlParameter(string tablename, bool isInsert)
            {
                DataTable table = ExcuteDataTable("select top 0 * from " + tablename);
                string Retable = GetTableName(tablename);
                List<string> strs = new List<string>();
                for (int i = 0; i < table.Columns.Count; i++)
                {
                    if (isInsert)
                    {
                        if (table.Columns[i].ColumnName.ToLower() != "id" && table.Columns[i].ColumnName.ToLower() != "status")
                        {
                            strs.Add("new SqlParameter("@" + table.Columns[i].ColumnName + "", dto." + table.Columns[i].ColumnName + ")");
                        }
                    }
                    else
                    {
                        if (table.Columns[i].ColumnName.ToLower() != "status")
                        {
                            strs.Add("new SqlParameter("@" + table.Columns[i].ColumnName + "", dto." + table.Columns[i].ColumnName + ")");
                        }
                    }
                }
                return string.Join(",", strs);
            }
    获取SqlParameter参数集

    其他忽略部分,作为优化用

            /// <summary>
            /// 表名排序
            /// </summary>
            /// <param name="s"></param>
            private List<string> TablesDesc(List<string> lsttable)
            {
                var query = from s in lsttable orderby s ascending select s;
                List<string> tables = new List<string>();
                foreach (string item in query)
                {
                    tables.Add(item);
                }
                return tables;
            }
    
            /// <summary>
            /// 获取表名后缀
            /// </summary>
            /// <param name="tableName"></param>
            /// <returns></returns>
            private string GetTableName(string tableName)
            {
                if (!tableName.Contains("_"))
                {
                    return tableName;
                }
                return tableName.Split('_')[1];
            }
  • 相关阅读:
    EntityFramework之创建数据库及基本操作(一)
    Entity Framework Code First (八)迁移 Migrations
    [转]Tomcat启动报错:AnnotationConfigBeanDefinitionParser are only available on JDK 1.5 and higher
    [转]bootstrap table本地数据使用方法
    [转]MySQL-5.7 Update语句详解
    [转]操作MySQL数据库报出:Parameter index out of range (1 > number of parameters, which is
    [转]在MySQL中创建实现自增的序列(Sequence)的教程
    [转]MySQL如何设置自动增长序列 SEQUENCE
    [转]Mustache 使用心得总结
    [转]关于重定向RedirectAttributes的用法
  • 原文地址:https://www.cnblogs.com/tuqun/p/3635341.html
Copyright © 2011-2022 走看看