自制代码生成器

在敲机房收费系统的时候,因为用三层的思想时需要用到实体类,最麻烦的是不断的来定义实体的属性值,真实烦人,想一想有没有好的方法来操作呢?

注意:实体的属性是与数据库中表的字段是相互对应的。

从网上查资料发现了代码生成器这个好东西,网上有免费的,大家可以学习一下,以后在做的时候就方便多了,但是更重要的是要知道原理,即本质。在这里小编就教大家来自制代码生成器,最简陋的操作,意在告诉大家代码生成器背后的原理。

代码如下

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 连接数据库操作
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        private DataTable ExecuteDataTable(string sql)
        {
            using (SqlConnection conn = new SqlConnection(textBox1 .Text ))
            {
                conn.Open();
                //创建命令对象
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    //只获得表的架构信息(列信息)
                    cmd.CommandText = sql;
                    DataSet ds = new DataSet();
                    SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                    adapter.FillSchema(ds, SchemaType.Source);//获得表信息必须要写
                    adapter.Fill(ds);
                    return ds.Tables[0];
                }

            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //查询出连接的数据库中所有表的名字
            DataTable table;
            try
            {
                //查询语句,用来查询数据库中表的名字
               table = ExecuteDataTable("select table_name from INFORMATION_SCHEMA.tables  where table_type ='base table'");

            }
                //当发生连接错误时,抛出异常
           catch (SqlException sqlex )
            {
                MessageBox.Show("连接数据库出错!错误信息:" + sqlex.Message);
                return;
            }

                //用来存储每张表的名字
            string[] tables=new string[table.Rows.Count ];

            //通过遍历来为字符串数组赋值
            for(int i=0;i<table.Rows.Count ;i++)
            {
                DataRow row=table.Rows[i];
                tables[i]=(string )row["table_name"];

            }
            comboBox1.DataSource  = tables;
            comboBox1.Enabled = true;

            //把连接字符串记录到文件中,避免用户每次都需要输入连接字符串
           // File.WriteAllText("",textBox1 .Text )
               // AppDomain.CurrentDomain .BaseDirectory //获得当前程序的路径
                  //string currentDir=AppDomain.CurrentDomain .BaseDirectory ;
            //string configFile=currentDir +"textbox1.txt"
            //用来拼接当前目录的路径
                  string configFile = GetConfigFilePath();
          //保存写入的字符串
            File.WriteAllText (configFile ,textBox1 .Text );
        }

        //封装保存字符串的路径
        private static string GetConfigFilePath()
        {
            //获得当前程序的路径
            string currentDir = AppDomain.CurrentDomain.BaseDirectory;
          //用来拼接路径
            string configFile = System.IO.Path.Combine(currentDir, "textbox1.text");
            return configFile;  //返回拼接的路径
        }

       /// <summary>
       /// 用来读出保存的路径
       /// </summary>
       /// <param name="sender"></param>
       /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            string configFile = GetConfigFilePath();
          textBox1 .Text =  File.ReadAllText(configFile);

        }

        private void button2_Click(object sender, EventArgs e)
        {
            //得到选择的表的名字
            string tablename = (string )comboBox1.SelectedItem;
            if(tablename =="")
            {
                MessageBox.Show("请选择要生成的表");
                return;
            }
            CreateModelCode(tablename);
        }

        private void CreateModelCode(string tableName)
        {
            //选择查询表的表头
            DataTable table = ExecuteDataTable("select top 0 * from "+tableName);
                //拼接字符串类
             StringBuilder sb = new StringBuilder();
            //定义类,此时类的名字就是表的名字,需要时可以随时更改
                sb.Append("public class").Append(tableName).AppendLine("{"); 

            //开始声明属性的名字
            foreach (DataColumn column in table.Columns )
            {
                //得到类的类型
                string columnDataType = GetDateTypeName(column);
                //定义属性
                sb.Append("public").Append(columnDataType ).Append("")
                    .Append(column.ColumnName).AppendLine("{get;set}");

            }
            sb.AppendLine("}");
            textBox2.Text = sb.ToString();
        }

        //进行可空类型的判断
        private static string GetDateTypeName(DataColumn column)
        {
            //如果列运行为NULL,并且列在C#中的类型是不可为空的(值类型)
            if(column.AllowDBNull&&column.DataType.IsValueType   )
            {
                return column.DataType + "?";
            }
            else
            {
                return column.DataType.ToString ();
            }
        }

    }
}

功能介绍

1.输入连接字符串

2.选择要生成代码的表

3.生成代码

原理介绍

1.根据字符串获取所有表名

select table_name from INFORMATION_SCHEMA.tables  where table_type =‘base table‘

2.通过执行select操作,得到的column的类型,列名等,还需要判断是否为空等信息

3.通过stringbuilder来完成字符串的拼接

小结:不怕不知道,就怕不知道,其实没有什么牛X的技术,就是通过查询数据库中的表名,然后通过查询列的属性等信息,通过遍历来完成所要实现的属性的拼接已。

-------------------------------------------------------聪明的程序员永远都有偷懒的办法-----------------------------------------------------



自制代码生成器

时间: 2024-10-25 07:32:26

自制代码生成器的相关文章

自制代码生成器 多种模版引擎 支持生成各种代码

自制代码生成器 多种模版引擎 支持生成各种代码 支持多种数据库 工作三年了  一直伴随本人的代码生涯 贡献之大 可想而知 过程中 它也经历了各种进货 1.先来看看界面 主界面 连接数据库  支持多种主流数据库 模版管理 模版编辑界面 支持三种模版引擎  可扩展 文件模版合成项目模版 单张表生成的时候 各个参数可以自定义 二次修改 这个功能目前还有点简陋 有时间继续完善 模版预编译 一个模版编译一次 保证最大效率 OK 后续有时间 慢慢方式代码 原文地址 http://www.cnblogs.co

自制工具:CSV代码生成器:自动生成CSV文件对应的C++实体类和字段类型解析代码

本文乃Siliphen原创,转载请注明出处:http://blog.csdn.net/stevenkylelee 更有开发效率地使用CSV文件 为了更有效率地使用CSV文件,我制作了一个工具:Code代码生成器. 这个工具可以对CSV文件进行简单地配置,自动生成这个CSV文件对应的C++数据结构和字段类型解析函数代码. 工程项目只要加入这些自动生成的代码,就可以更方便地使用来自CSV配置文件的数据. 用工具自动生代码,可以省去了手工编写.手工维护那些大量的.无聊繁琐的类型定义.数据转换的代码的过

#ASP.NET 自制免费.NET代码生成器KevinCodeBuilder

简单的.NET三层架构会有很多重复的代码,如果手敲会比较浪费时间.前段时间在互联网找了下.NET的代码生成器,发现要么太复杂甚至生成的代码会报错,要么要收费而且效果不是自己想要的. 所以,干脆自己做一个咯,花了几天时间代码生成器终于诞生了,命名KevinCodeBuilder. 点击下载 话不多说,有图有真相.免费分享给网友啦,需要的话可以直接下载使用哈.软件里有我的作者信息,欢迎和我交流和打赏支持哈^^ 功能介绍 一键生成三层架构Model层和DAL层代码,支持代码结构预览功能,节省大量的时间

【自制小工具】代码生成器

陆陆续续接触过好几款代码生成工具,发现确实好用,但都会有那么点不完善的地方,所以索性就自己做一个吧. 界面非常简单,反正是自己用的,简单点用起来也方便 上图:左侧是服务器列表(该列表是通过语句获取的,不受 Sql Server 版本影响,除非语法变了     右侧代码生成区 : 功能上内置了 1. 导出实体类(包含属性,方法有 List 转 DataTable, DataTable 转 List,生成实体表) (支持列的筛选) 2. SELECT ,UPDATE ,INSERT,DELETE ,

自制linux小系统

自制linux 今天说一说怎么自制一个linux,也就是用一块新硬盘来自己搞一个linux.硬盘拆掉撞到其他机器上可以照常使用,需要什么东西都是自己添加的哦. 那我就在虚拟机里进行了嘿嘿嘿... 1.在我的centos里加了一块新的硬盘并顺便分了个区,并且格式化了一下. [[email protected] ~]# fdisk /dev/sdb WARNING: DOS-compatible mode is deprecated. It's strongly recom mended to   

java SSM框架 多数据源 代码生成器 websocket即时通讯 shiro redis 后台框架源码

获取[下载地址]   QQ: 313596790官网 http://www.fhadmin.org/A 调用摄像头拍照,自定义裁剪编辑头像,头像图片色度调节B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类,service等完整模块C 集成阿里巴巴数据库连接池druid  数据库连接池  阿里巴巴的 druid.Druid在监控.可扩展性.稳定性和性能方面都

java 企业网站源码 后台 springmvc SSM 前台 静态化 代码生成器

java 企业网站源码 前后台都有 静态模版引擎, 代码生成器大大提高开发效率 点击:获取地址 QQ 313596790 系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态化模版引擎生成html 2.因为是生成的html,所以访问速度快,轻便,对服务器负担小 3.网站前端采用主流的相应式布局,支持PC.平板.手机浏览器访问 4.springmvc +spring4.2.5+ mybaits3.3  SSM 普通java web(非maven) 

动软代码生成器 可用于生成Entity层,可更改模板 /codesmith 也可以

动软代码生成器官方下载地址:http://www.maticsoft.com/download.aspx 教程:http://jingyan.baidu.com/article/219f4bf7dfda86de442d380b.html codesmith  用法实例:http://www.cnblogs.com/huangcong/archive/2010/06/14/1758201.html

论动软代码生成器的好与坏

曾几何时,动软代码生成器是一种非常方便的工具,很多从事C#语言的开发人员都用过这个工具,当然也包括楼主本人. 以往的开发模式都是围绕数据库为中心展开的,先设计好数据库,然后再编写代码.动软代码生成器就是在这样的背景下诞生的. 你只要设计好数据库模式,然后用动软代码生成器一键生成数据访问层代码,非常方便.(虽然动软有业务层,但我认为那是鸡肋,只不过是数据访问层的一层简单包装,没有实际意义) 这对不想手动编写枯燥乏味的数据库操作的开发人员来说,非常有吸引力. 下面楼主凭借自己的经验,从好与坏两个方面