一、环境准备
VS2017 Enterprise、Winform
二、代码生成器的创建
1、使用VS 创建一个winform项目,命名为MySqlCode,然后从Nuget中搜索安装MySql.Data
2、创建一个App.config文件,配置数据库连接
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<!--数据库连接-->
<add key="MySqlConnection" value="server=192.168.1.105;user id=dev;database=openauthdbtest;password=dev"/>
<!--需要生成代码的数据库名称-->
<add key="dbName" value="openauthdbtest"/>
</appSettings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
</startup>
</configuration>
3、创建数据库帮助类MySqlHelper.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;
using System.Data;
using MySql.Data.MySqlClient;
namespace MySqlCode
{
/// <summary>
/// mysql帮助类
/// </summary>
public class MySqlHelper
{
private string connection = ConfigurationManager.AppSettings["MySqlConnection"].ToString();
private string dbName = ConfigurationManager.AppSettings["dbName"].ToString();
public MySqlHelper() { }
/// <summary>
/// 构造函数
/// </summary>
/// <param name="_connection">连接地址</param>
/// <param name="_dbName">数据库名称</param>
public MySqlHelper(string _connection, string _dbName)
{
connection = _connection;
dbName = _dbName;
}
//MySqlHelper单实例
private static MySqlHelper _instance = null;
public static MySqlHelper Ins
{
get { if (_instance == null) { _instance = new MySqlHelper(); } return _instance; }
}
/// <summary>
/// 获取数据表信息
/// </summary>
/// <returns></returns>
public DataTable GetTableInfo()
{
//获取数据库中的数据表信息
string sql = "Select table_name TableName ,TABLE_COMMENT TableRemark from INFORMATION_SCHEMA.TABLES Where table_schema = '"+dbName+ "' order by table_name";
using (MySqlConnection con = new MySqlConnection(connection))
{
MySqlDataAdapter sqlda = new MySqlDataAdapter(sql, con);
DataTable dt = new DataTable();
sqlda.Fill(dt);
return dt;
}
}
/// <summary>
/// 获取数据表字段信息
/// </summary>
/// <param name="tableName">数据库表名</param>
/// <returns></returns>
public DataTable GetColumnInfo(string tableName)
{
//获取数据库中的数据表字段信息
string sql = "Select COLUMN_NAME,DATA_TYPE,COLUMN_COMMENT,IS_NULLABLE,COLUMN_KEY,COLUMN_DEFAULT from INFORMATION_SCHEMA.COLUMNS";
sql += " Where table_name = '"+tableName+"' And table_schema = '"+dbName+"' ORDER BY ordinal_Position";
using (MySqlConnection con = new MySqlConnection(connection))
{
MySqlDataAdapter sqlda = new MySqlDataAdapter(sql, con);
DataTable dt = new DataTable();
sqlda.Fill(dt);
return dt;
}
}
/// <summary>
/// 需要获得多个结果集的时候用该方法,返回DataSet对象。
/// </summary>
/// <param name="sql语句"></param>
/// <returns></returns>
public DataSet ExecuteDataSet(string sql, params MySqlParameter[] paras)
{
using (MySqlConnection con = new MySqlConnection(connection))
{
//数据适配器
MySqlDataAdapter sqlda = new MySqlDataAdapter(sql, con);
sqlda.SelectCommand.Parameters.AddRange(paras);
DataSet ds = new DataSet();
sqlda.Fill(ds);
return ds;
//不需要打开和关闭链接.
}
}
/// <summary>
/// 获得单个结果集时使用该方法,返回DataTable对象。
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public DataTable ExcuteDataTable(string sql, params MySqlParameter[] paras)
{
using (MySqlConnection con = new MySqlConnection(connection))
{
MySqlDataAdapter sqlda = new MySqlDataAdapter(sql, con);
sqlda.SelectCommand.Parameters.AddRange(paras);
DataTable dt = new DataTable();
sqlda.Fill(dt);
return dt;
}
}
/// <summary>
/// 执行一条计算查询结果语句,返回查询结果(object)。
/// </summary>
/// <param name="SQLString">计算查询结果语句</param>
/// <returns>查询结果(object)</returns>
public object ExecuteScalar(string SQLString, params MySqlParameter[] paras)
{
using (MySqlConnection con = new MySqlConnection(connection))
{
using (MySqlCommand cmd = new MySqlCommand(SQLString, con))
{
try
{
con.Open();
cmd.Parameters.AddRange(paras);
object obj = cmd.ExecuteScalar();
if ((Object.Equals(obj, null)) || (Object.Equals(obj, DBNull.Value)))
{
return null;
}
else
{
return obj;
}
}
catch (MySqlException e)
{
con.Close();
throw e;
}
}
}
}
/// <summary>
/// 执行Update,Delete,Insert操作
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public int ExecuteNonquery(string sql, params MySqlParameter[] paras)
{
using (MySqlConnection con = new MySqlConnection(connection))
{
MySqlCommand cmd = new MySqlCommand(sql, con);
cmd.Parameters.AddRange(paras);
con.Open();
return cmd.ExecuteNonQuery();
}
}
/// <summary>
/// 调用存储过程 无返回值
/// </summary>
/// <param name="procname">存储过程名</param>
/// <param name="paras">sql语句中的参数数组</param>
/// <returns></returns>
public int ExecuteProcNonQuery(string procname, params MySqlParameter[] paras)
{
using (MySqlConnection con = new MySqlConnection(connection))
{
MySqlCommand cmd = new MySqlCommand(procname, con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddRange(paras);
con.Open();
return cmd.ExecuteNonQuery();
}
}
/// <summary>
/// 存储过程 返回Datatable
/// </summary>
/// <param name="procname"></param>
/// <param name="paras"></param>
/// <returns></returns>
public DataTable ExecuteProcQuery(string procname, params MySqlParameter[] paras)
{
using (MySqlConnection con = new MySqlConnection(connection))
{
MySqlCommand cmd = new MySqlCommand(procname, con);
cmd.CommandType = CommandType.StoredProcedure;
MySqlDataAdapter sqlda = new MySqlDataAdapter(procname, con);
sqlda.SelectCommand.Parameters.AddRange(paras);
DataTable dt = new DataTable();
sqlda.Fill(dt);
return dt;
}
}
/// <summary>
/// 多语句的事物管理
/// </summary>
/// <param name="cmds">命令数组</param>
/// <returns></returns>
public bool ExcuteCommandByTran(params MySqlCommand[] cmds)
{
using (MySqlConnection con = new MySqlConnection(connection))
{
con.Open();
MySqlTransaction tran = con.BeginTransaction();
foreach (MySqlCommand cmd in cmds)
{
cmd.Connection = con;
cmd.Transaction = tran;
cmd.ExecuteNonQuery();
}
tran.Commit();
return true;
}
}
/// <summary>
/// 分页
/// </summary>
/// <param name="sql"></param>
/// <param name="totalCount"></param>
/// <param name="paras"></param>
/// <returns></returns>
public DataTable ExcuteDataWithPage(string sql, ref int totalCount, params MySqlParameter[] paras)
{
using (MySqlConnection con = new MySqlConnection(connection))
{
MySqlDataAdapter dap = new MySqlDataAdapter(sql, con);
DataTable dt = new DataTable();
dap.SelectCommand.Parameters.AddRange(paras);
dap.Fill(dt);
MySqlParameter ttc = dap.SelectCommand.Parameters["@totalCount"];
if (ttc != null)
{
totalCount = Convert.ToInt32(ttc.Value);
}
return dt;
}
}
}
}
4、调用 获取表信息以及表字段方法,解析字段信息,生成自己需要的代码
示例:
/// <summary>
/// 生成代码
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void createCodeToolStripMenuItem_Click(object sender, EventArgs e)
{
DataTable dtColumns = MySqlHelper.Ins.GetColumnInfo(tablename);
string upperTableName= FirstToUpper(tablename);
string searchParmeter = "Query" + upperTableName + "ListReq";//查询条件实体
string searchP = tablename + "Request";
if (dtColumns.Rows.Count > 0)
{
#region Model
StringBuilder requestCodeText = new StringBuilder();
requestCodeText.Append("//*************************************************************************************************\r\n");
requestCodeText.Append("//概要:" + tableRemark + "\r\n");
requestCodeText.Append("//创建者 :LiWan\r\n");
requestCodeText.Append("//创建日期:" + DateTime.Now.ToString("yyyy-MM-dd") + "\r\n");
requestCodeText.Append("//更新履历:更新内容 更新日 更新者:\r\n");
requestCodeText.Append("//*************************************************************************************************\r\n");
requestCodeText.Append("//UpdateRecord:\r\n");
requestCodeText.Append("using System;\r\n");
requestCodeText.Append("using System.Collections.Generic;\r\n");
requestCodeText.Append("using System.Text;\r\n\r\n");
requestCodeText.Append("namespace OpenAuth.App.Request\r\n");
requestCodeText.Append("{\r\n");
requestCodeText.Append(" /// <summary>\r\n");
requestCodeText.Append(" /// " + tableRemark + "查询参数\r\n");
requestCodeText.Append(" /// </summary>\r\n");
requestCodeText.Append(" public class " + searchParmeter + ":PageReq\r\n");
requestCodeText.Append(" {\r\n");
StringBuilder modelCodeText = new StringBuilder();//实体类代码
modelCodeText.Append("//*************************************************************************************************\r\n");
modelCodeText.Append("//概要:" + tableRemark + "\r\n");
modelCodeText.Append("//创建者 :LiWan\r\n");
modelCodeText.Append("//创建日期:" + DateTime.Now.ToString("yyyy-MM-dd") + "\r\n");
modelCodeText.Append("//更新履历:更新内容 更新日 更新者:\r\n");
modelCodeText.Append("//*************************************************************************************************\r\n");
modelCodeText.Append("//UpdateRecord:\r\n");
modelCodeText.Append("using System;\r\n");
modelCodeText.Append("using System.ComponentModel;\r\n");
modelCodeText.Append("using System.ComponentModel.DataAnnotations.Schema;\r\n");
modelCodeText.Append("using OpenAuth.Repository.Core;\r\n\r\n");
modelCodeText.Append("namespace OpenAuth.Repository.Model\r\n");
modelCodeText.Append("{\r\n");
modelCodeText.Append(" /// <summary>\r\n");
modelCodeText.Append(" /// "+tableRemark+"\r\n");
modelCodeText.Append(" /// </summary>\r\n");
modelCodeText.Append(" [Table("+"\""+upperTableName +"\""+ ")]\r\n");
modelCodeText.Append(" public partial class " + upperTableName + ":Entity\r\n");
modelCodeText.Append(" {\r\n");
foreach(DataRow dr in dtColumns.Rows)
{
string columnName = dr["COLUMN_NAME"].ToString();//字段名称
string dataType= dr["DATA_TYPE"].ToString();//数据类型
string columnRemark= dr["COLUMN_COMMENT"].ToString(); //字段备注
string isNotNull= dr["IS_NULLABLE"].ToString(); //是否可为空
string isKey = dr["COLUMN_KEY"].ToString();//是否主键判断
string defaultValue= dr["COLUMN_DEFAULT"].ToString();//默认值
if (columnName != "Id"&& columnName != "CreateTime" && columnName != "CreateUser" && columnName != "CreateUserName" && columnName != "ModifyTime" && columnName != "ModifyUser"&& columnName != "ModifyUserName")
{
modelCodeText.Append(" /// <summary>\r\n");
modelCodeText.Append(" /// "+columnRemark+"\r\n");
modelCodeText.Append(" /// </summary>\r\n");
modelCodeText.Append(" [Description("+"\""+columnRemark+"\""+")]\r\n");
if (dataType == "varchar"||dataType=="text"||dataType=="longtext"|| dataType == "char"|| dataType == "tinytext" || dataType == "mediumtext")
{
requestCodeText.Append(" /// <summary>\r\n");
requestCodeText.Append(" /// " + columnRemark + "\r\n");
requestCodeText.Append(" /// </summary>\r\n");
requestCodeText.Append(" public string " + columnName + " {get;set;}\r\n");
modelCodeText.Append(" public string " + columnName + " {get;set;}=string.Empty;\r\n");
}
if (dataType == "int"|| dataType == "tinyint"|| dataType == "interger" || dataType == "smallint"|| dataType == "mediumint" || dataType == "bigint")
{
if (isNotNull == "YES")
{
modelCodeText.Append(" public int " + columnName + " {get;set;}\r\n");
}
else
{
modelCodeText.Append(" public ?int " + columnName + " {get;set;}\r\n");
}
}
if (dataType == "float")
{
if (isNotNull == "YES")
{
modelCodeText.Append(" public float " + columnName + " {get;set;}\r\n");
}
else
{
modelCodeText.Append(" public ?float " + columnName + " {get;set;}\r\n");
}
}
if (dataType == "double")
{
if (isNotNull == "YES")
{
modelCodeText.Append(" public double " + columnName + " {get;set;}\r\n");
}
else
{
modelCodeText.Append(" public ?double " + columnName + " {get;set;}\r\n");
}
}
if (dataType == "decimal")
{
if (isNotNull == "YES")
{
modelCodeText.Append(" public decimal " + columnName + " {get;set;}\r\n");
}
else
{
modelCodeText.Append(" public ?decimal " + columnName + " {get;set;}\r\n");
}
}
if (dataType== "datetime"|| dataType == "date")
{
if (isNotNull == "YES")
{
modelCodeText.Append(" public DateTime " + columnName + " {get;set;}\r\n");
}
else
{
modelCodeText.Append(" public ?DateTime " + columnName + " {get;set;}\r\n");
}
}
}
}
modelCodeText.Append(" }\r\n");
modelCodeText.Append("}");
txtModelCode.Text = modelCodeText.ToString();
requestCodeText.Append(" }\r\n");
requestCodeText.Append("}");
txtRequestCode.Text = requestCodeText.ToString();
#endregion
#region DAL
StringBuilder dalCodeText = new StringBuilder();//dal代码
dalCodeText.Append("//*************************************************************************************************\r\n");
dalCodeText.Append("//概要:" + tableRemark + "\r\n");
dalCodeText.Append("//创建者 :LiWan\r\n");
dalCodeText.Append("//创建日期:" + DateTime.Now.ToString("yyyy-MM-dd") + "\r\n");
dalCodeText.Append("//更新履历:更新内容 更新日 更新者:\r\n");
dalCodeText.Append("//*************************************************************************************************\r\n");
dalCodeText.Append("//UpdateRecord:\r\n");
dalCodeText.Append("using System;\r\n");
dalCodeText.Append("using System.Collections.Generic;\r\n");
dalCodeText.Append("using System.Text;\r\n");
dalCodeText.Append("using System.Linq;\r\n");
dalCodeText.Append("using System.Linq.Expressions;\r\n");
dalCodeText.Append("using Infrastructure;\r\n");
dalCodeText.Append("using OpenAuth.App.Interface;\r\n");
dalCodeText.Append("using OpenAuth.App.Request;\r\n");
dalCodeText.Append("using OpenAuth.App.Response;\r\n");
dalCodeText.Append("using OpenAuth.Repository.Model;\r\n");
dalCodeText.Append("using OpenAuth.Repository.Interface;\r\n\r\n");
dalCodeText.Append("namespace OpenAuth.App\r\n");
dalCodeText.Append("{\r\n");
dalCodeText.Append(" /// <summary>\r\n");
dalCodeText.Append(" /// " + tableRemark + "数据层\r\n");
dalCodeText.Append(" /// </summary>\r\n");
dalCodeText.Append(" public class " + upperTableName + "App:BaseApp<"+ upperTableName + ">\r\n");
dalCodeText.Append(" {\r\n");
dalCodeText.Append(" private IAuth _auth;\r\n");
dalCodeText.Append(" /// <summary>\r\n");
dalCodeText.Append(" /// 构造函数\r\n");
dalCodeText.Append(" /// </summary>\r\n");
dalCodeText.Append(" /// <param name=\"unitWork\"></param>\r\n");
dalCodeText.Append(" /// <param name=\"repository\"></param>\r\n");
dalCodeText.Append(" /// <param name=\"auth\"></param>\r\n");
dalCodeText.Append(" public "+ upperTableName + "App(IUnitWork unitWork, IRepository<"+ upperTableName + "> repository, IAuth auth) : base(unitWork, repository)\r\n");
dalCodeText.Append(" {\r\n");
dalCodeText.Append(" _auth = auth;\r\n");
dalCodeText.Append(" }\r\n");
dalCodeText.Append(" /// <summary>\r\n");
dalCodeText.Append(" /// 新增\r\n");
dalCodeText.Append(" /// </summary>\r\n");
dalCodeText.Append(" /// <param name=\""+tablename+"\"></param>\r\n");
dalCodeText.Append(" public void Add("+ upperTableName + " "+tablename+")\r\n");
dalCodeText.Append(" {\r\n");
dalCodeText.Append(" var loginContent = _auth.GetCurrentUser();\r\n");
dalCodeText.Append(" "+tablename+"."+ "CreateTime = DateTime.Now;\r\n");
dalCodeText.Append(" "+tablename + "." + "CreateUser = loginContent.User.Id.ToString();\r\n");
dalCodeText.Append(" "+tablename + "." + "CreateUserName = loginContent.User.UserName.ToString();\r\n");
dalCodeText.Append(" Repository.Add("+ tablename+ ");\r\n");
dalCodeText.Append(" }\r\n");
dalCodeText.Append(" /// <summary>\r\n");
dalCodeText.Append(" /// 修改\r\n");
dalCodeText.Append(" /// </summary>\r\n");
dalCodeText.Append(" /// <param name=\"" + tablename + "\"></param>\r\n");
dalCodeText.Append(" public void Update(" + upperTableName + " " + tablename + ")\r\n");
dalCodeText.Append(" {\r\n");
dalCodeText.Append(" var loginContent = _auth.GetCurrentUser();\r\n");
dalCodeText.Append(" var model = Repository.FindSingle(x=>x.Id.Equals("+ tablename + ".Id));\r\n");
dalCodeText.Append(" " + tablename + "." + "CreateTime = model.CreateTime;\r\n");
dalCodeText.Append(" " + tablename + "." + "CreateUser = model.CreateUser;\r\n");
dalCodeText.Append(" " + tablename + "." + "CreateUserName = model.CreateUserName;\r\n");
dalCodeText.Append(" " + tablename + "." + "ModifyTime = DateTime.Now;\r\n");
dalCodeText.Append(" " + tablename + "." + "ModifyUser = loginContent.User.Id.ToString();\r\n");
dalCodeText.Append(" " + tablename + "." + "ModifyUserName =loginContent.User.UserName.ToString();\r\n");
dalCodeText.Append(" Repository.Update(" + tablename + ");\r\n");
dalCodeText.Append(" }\r\n");
dalCodeText.Append(" /// <summary>\r\n");
dalCodeText.Append(" /// 根据Id获取数据\r\n");
dalCodeText.Append(" /// </summary>\r\n");
dalCodeText.Append(" /// <param name=\"" + tablename + "\"></param>\r\n");
dalCodeText.Append(" public "+ upperTableName + " GetByID(string Id)\r\n");
dalCodeText.Append(" {\r\n");
dalCodeText.Append(" return Repository.FindSingle(x=>x.Id.Equals(Id));\r\n");
dalCodeText.Append(" }\r\n");
dalCodeText.Append(" /// <summary>\r\n");
dalCodeText.Append(" /// 获取数据\r\n");
dalCodeText.Append(" /// </summary>\r\n");
dalCodeText.Append(" /// <returns></returns>\r\n");
dalCodeText.Append(" public TableData GetList()\r\n");
dalCodeText.Append(" {\r\n");
dalCodeText.Append(" var loginContent = _auth.GetCurrentUser();\r\n");
dalCodeText.Append(" if (loginContent == null)\r\n");
dalCodeText.Append(" {\r\n");
dalCodeText.Append(" throw new CommonException(\"登录已过期\", Define.INVALID_TOKEN);\r\n");
dalCodeText.Append(" }\r\n");
dalCodeText.Append(" //var properties = loginContent.GetProperties(" + "\""+ upperTableName +"\""+ ");\r\n");
dalCodeText.Append(" //if (properties == null || properties.Count == 0)\r\n");
dalCodeText.Append(" //{\r\n");
dalCodeText.Append(" //throw new Exception(\"当前登录用户没有访问该模块字段的权限,请联系管理员配置\");\r\n");
dalCodeText.Append(" //}\r\n");
dalCodeText.Append(" var result = new TableData();\r\n");
dalCodeText.Append(" var dataList = Repository.Find(null);\r\n");
dalCodeText.Append(" result.columnHeaders = properties;\r\n");
dalCodeText.Append(" result.data = dataList.ToList();\r\n");
dalCodeText.Append(" result.count = dataList.Count();\r\n");
dalCodeText.Append(" return result;\r\n");
dalCodeText.Append(" }\r\n");
dalCodeText.Append(" /// <summary>\r\n");
dalCodeText.Append(" /// 获取分页数据\r\n");
dalCodeText.Append(" /// </summary>\r\n");
dalCodeText.Append(" /// <returns></returns>\r\n");
dalCodeText.Append(" public TableData GetPageList("+ searchParmeter+ " "+searchP+")\r\n");
dalCodeText.Append(" {\r\n");
dalCodeText.Append(" var loginContent = _auth.GetCurrentUser();\r\n");
dalCodeText.Append(" if (loginContent == null)\r\n");
dalCodeText.Append(" {\r\n");
dalCodeText.Append(" throw new CommonException(\"登录已过期\", Define.INVALID_TOKEN);\r\n");
dalCodeText.Append(" }\r\n");
dalCodeText.Append(" //var properties = loginContent.GetProperties(" + "\"" + upperTableName +"\"" +");\r\n");
dalCodeText.Append(" //if (properties == null || properties.Count == 0)\r\n");
dalCodeText.Append(" //{\r\n");
dalCodeText.Append(" //throw new Exception(\"当前登录用户没有访问该模块字段的权限,请联系管理员配置\");\r\n");
dalCodeText.Append(" //}\r\n");
dalCodeText.Append(" Expression<Func<"+ upperTableName + ", bool>> predicate =x=>true;\r\n");
dalCodeText.Append(" var dataList = Repository.Find("+ searchP+".page,"+ searchP+".limit, \"CreateTime descending\", predicate);\r\n");
dalCodeText.Append(" var result = new TableData();\r\n");
dalCodeText.Append(" result.columnHeaders = properties;\r\n");
dalCodeText.Append(" result.data = dataList.ToList();\r\n");
dalCodeText.Append(" result.count = Repository.GetCount(predicate);\r\n");
dalCodeText.Append(" return result;\r\n");
dalCodeText.Append(" }\r\n");
dalCodeText.Append(" }\r\n");
dalCodeText.Append("}");
txtDalCode.Text = dalCodeText.ToString();
#endregion
#region Controller
#endregion
#region Index
#endregion
#region Edit
#endregion
}
}