在敲机房收费系统的时候,因为用三层的思想时需要用到实体类,最麻烦的是不断的来定义实体的属性值,真实烦人,想一想有没有好的方法来操作呢?
注意:实体的属性是与数据库中表的字段是相互对应的。
从网上查资料发现了代码生成器这个好东西,网上有免费的,大家可以学习一下,以后在做的时候就方便多了,但是更重要的是要知道原理,即本质。在这里小编就教大家来自制代码生成器,最简陋的操作,意在告诉大家代码生成器背后的原理。
代码如下
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的技术,就是通过查询数据库中的表名,然后通过查询列的属性等信息,通过遍历来完成所要实现的属性的拼接已。
-------------------------------------------------------聪明的程序员永远都有偷懒的办法-----------------------------------------------------