【提升编程效率】单号生成器(定义编号规则、流水号、产生业务单号)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129129787
【提升编程效率】日期范围生成器(构建开始日期、结束日期)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129040663
【提升编程效率】Excel数据批量导入工具
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126427323
【提升编程效率】打印解决方案(支持打印模板、条形码、二维码、图片)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129415723
本专栏为【提升编程效率】,主要介绍开发过程中,遇到的一些重复性、机械性、简单性的问题,采用工具代替人工,提升生产力,解放程序员,让其有更多精力投入软件设计。
我的初心是:将软件开发中弯弯绕绕、易错代码逻辑自动生成,软件开发者可以直接复制到项目。总之就是给软件开发者减负,使得写代码变成一件开心的事情。
本专栏会持续更新,不断优化【提高编程效率】专栏,大家有任何问题,可以私信我。如果您对本专栏其它生产力工具感兴趣,欢迎关注,我将带你用最简洁的代码,实现最复杂的功能。
本文主要介绍自动代码模板生成器,其实就是通过我的工具,您可以自动完成一些代码的编写。它自动生成了 “类文件”,您可以直接拷贝到项目中运行。
本文已经实现:数据模型的构建(Model层)、数据逻辑代码的构建(BLL层)、数据库交互代码的构建(DAL层)
这我也没什么好讲的,你们自己看我设计的界面吧,当然你们也可以设计最佳界面,把源码直接展现在功能上。
这段代码,取自于我的《底层库》专栏,链接附上就不过多介绍了。
C#底层库–MySQL数据库访问操作辅助类(推荐阅读)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126886379
创建数据库操作类 DBOperation.cs,复制以下代码:
注意:这里用到 底层库专栏《C#底层库--MySQL数据库访问操作辅助类(推荐阅读)》、《C#底层库--MySQL数据库脚本构建类(推荐阅读)》、《C#底层库--XML配置参数读写辅助类(推荐阅读)》,是不是还有人没有关注啊?我不提醒你们知道吗?
using System.Data;
namespace CreateCode.DAL
{
public class DBOperation
{
///
/// 查询所有库
///
///
public static DataTable GetDataBases()
{
string l_strSql = "SHOW DATABASES";
return MySQLHelper.ShowDataBases(l_strSql).Tables[0] ;
}
///
/// 查询表
///
///
public static DataTable GetDataTables()
{
string l_strSql = $@"select table_name from information_schema.tables
where table_schema='{MySQLHelper.dataBaseName}'
order by table_name";
return MySQLHelper.Query(l_strSql).Tables[0];
}
///
/// 查询列
///
///
public static DataSet GetDataColumns(string a_strTableName)
{
string l_strSql = $@"select column_name,data_type from information_schema.columns
WHERE TABLE_SCHEMA = '{MySQLHelper.dataBaseName}' AND TABLE_NAME = '{a_strTableName}'";
return MySQLHelper.Query(l_strSql);
}
}
}
创建类ConvertDataType.cs,这里面包含 数据库类型到C#数据类型的转换,以及文件的操作、类、命名空间重命名。我就没有进一步细分,建议你们可以把它拆分一下,分成不同的类文件。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CreateCode.BLL
{
public static class ConvertDataType
{
public static string SqlTypeToCType(string sqlType)
{
string cType = string.Empty;
switch (sqlType.Trim().ToLower())
{
//字符型
case "char":
case "varchar":
case "nvarchar":
case "text":
case "longtext":
case "utext":
case "set":
cType = "string";
break;
//整型
case "int":
case "decimal":
cType = "decimal";
break;
case "smallint":
case "bigint":
case "mediumint":
cType = "int";
break;
case "tinyint":
cType = "sbyte";
break;
//长整型
case "longblob":
cType = "long";
break;
//浮点型
case "float":
cType = "float";
break;
case "money":
cType = "Decimal";
break;
//双精度浮点型
case "double":
cType = "double";
break;
//布尔型
case "binary":
case "bit":
case "bool":
case "boolean":
cType = "bool";
break;
//日期型
case "date":
case "datetime":
case "time":
case "timestamp":
case "year":
cType = "DateTime";
break;
//字节
case "varbinary":
case "image":
case "blob":
case "mediumblob":
cType = "byte[]";
break;
//枚举
case "enum":
cType = "enum";
break;
default:
cType = "string";
break;
}
return cType;
}
public static void FileWrite(string a_fileText, string a_FileFullPath)
{
string dir = Path.GetDirectoryName(a_FileFullPath);
if (!Directory.Exists(dir)) //目录不存在创建目录
{
Directory.CreateDirectory(dir);
}
//if (!File.Exists(a_path)) //文件不存在创建文件
//{
// File.Create(a_path).Close();//防止文件创建被占用,创建成功即文件流关闭
//}
using (FileStream fs = new FileStream(a_FileFullPath, FileMode.Create))
{
using (StreamWriter sw = new StreamWriter(fs, Encoding.UTF8))
{
sw.Write(a_fileText);
}
}
}
///
/// 首字母大写
///
///
///
public static string ToUpperFirstword(string a_strValue)
{
if (string.IsNullOrEmpty(a_strValue))
{
return string.Empty;
}
else
{
return a_strValue.Substring(0, 1).ToUpper() + a_strValue.Substring(1).ToLower();
}
}
///
/// 驼峰命名法
///
///
///
public static string ToCamelName(string a_strValue)
{
StringBuilder result = new StringBuilder();
if (a_strValue == null || string.IsNullOrEmpty(a_strValue))
{
return string.Empty;
}
else if (!a_strValue.Contains("_"))// 不含下划线,仅将首字母大写
{
return ToUpperFirstword(a_strValue);
}
else
{
// 用下划线将原始字符串分割
string[] camels = a_strValue.Split('_');
foreach (string camel in camels)
{
// 跳过原始字符串中开头、结尾的下换线或双重下划线
if (string.IsNullOrEmpty(camel))
{
continue;
}
if (result.Length == 0) // 第一个驼峰片段,全部字母都小写
{
result.Append(camel.ToLower());
}
else
{
// 其他的驼峰片段,首字母大写,其它小写
result.Append(camel.Substring(0, 1).ToUpper());
result.Append(camel.Substring(1).ToLower());
}
}
}
return result.ToString();
}
}
}
创建类代码工厂类CodeFactory.cs,作用就是产生代码模板,复制以下代码:
using CreateCode.DAL;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CreateCode.BLL
{
public static class CodeFactory
{
#region 创建Model
public static void CreateModel(string a_strNameSpace, string a_strTableName, string a_strDirPath)
{
StringBuilder l_sb = new StringBuilder();
l_sb.AppendLine("using System;");
l_sb.AppendLine();
l_sb.AppendLine($"namespace {a_strNameSpace}.Model");
l_sb.AppendLine("{");
l_sb.AppendLine(@" /// ");
l_sb.AppendLine($@" /// Model层 {a_strTableName}(以下代码由工具自动生成,有错误请反馈)");
l_sb.AppendLine(@" /// ");
l_sb.AppendLine($" public class {ConvertDataType.ToUpperFirstword(a_strTableName)}");
l_sb.AppendLine(" {");
l_sb.AppendLine(" public "+ ConvertDataType.ToUpperFirstword(a_strTableName)+ "() { }");
var dt = DBOperation.GetDataColumns(a_strTableName).Tables["ds"];
foreach (DataRow dr in dt.Rows)
{
string l_strType = ConvertDataType.SqlTypeToCType(dr["data_type"].ToString());
l_sb.Append($" public {l_strType} {dr["column_name"].ToString()}").Append(" { get; set; }").AppendLine();
}
l_sb.AppendLine(" }");
l_sb.AppendLine("}");//命名空间结束括号
string l_strFilePath = Path.Combine(a_strDirPath, "Model", $"{a_strTableName}Model.cs");
ConvertDataType.FileWrite(l_sb.ToString(), l_strFilePath);
}
#endregion
#region 创建DAL数据访问层
public static void CreateDAL(string a_strNameSpace, string a_strTableName, string a_strDirPath)
{
//去除自增列
//string colsNotAutoKey = GetColumns(a_dtTable).Where(m => m != txt.AutoAdd.text.trim()).toarry();
//l_sb.AppendLine(" DBHelperMySQL sh = new DBHelperMySQL();");
//l_sb.AppendLine($" {string.Join(",", l_strs)} values");
//l_sb.AppendLine($" ({string.Join(",", l_strs.Select(m => "@" + m))}\", values");
StringBuilder l_sb = new StringBuilder();
l_sb.AppendLine("using System;");
l_sb.AppendLine("using System.Collections.Generic;");
l_sb.AppendLine("using System.Data;");
l_sb.AppendLine("using CreateCode.DAL;");
l_sb.AppendLine();
l_sb.AppendLine(@"/// ");
l_sb.AppendLine($@"/// DAL层 {a_strTableName}(以下代码由工具自动生成,有错误请反馈)");
l_sb.AppendLine(@"/// ");
l_sb.AppendLine($"namespace {a_strNameSpace}.DAL"); //命名空间
l_sb.AppendLine("{"); //命名空间
l_sb.AppendLine($" public class {ConvertDataType.ToUpperFirstword(a_strTableName)}");
l_sb.AppendLine(" {");
l_sb.AppendLine(" /// " );
l_sb.AppendLine(" /// 执行语句(带事务回滚机制):插入、修改、删除");
l_sb.AppendLine(" /// 使用条件:需引入封装类DBHelperMySQL.cs、MakeSQLHelper.cs");
l_sb.AppendLine(" /// ");
l_sb.AppendLine(" /// 返回执行行数 ");
l_sb.AppendLine(" public int ExecuteSql()");
l_sb.AppendLine(" {");
l_sb.AppendLine(" List list = new List();" );
l_sb.AppendLine(" List SQLTextList = new List();" );
l_sb.AppendLine(" SQLTextList.Clear();");
l_sb.AppendLine("");
l_sb.AppendLine(" //1、插入语句");
l_sb.AppendLine(" MakeSQLHelper MakeSQL = new MakeSQLHelper();");
l_sb.AppendLine($" string l_strInsertSql = MakeSQL.CreateInsertSQLBuilder({a_strTableName}, list);");
l_sb.AppendLine(" SQLTextList.Add(l_strInsertSql);");
l_sb.AppendLine("");
l_sb.AppendLine(" //2、修改语句");
l_sb.AppendLine(" string l_strModifySql = \"update \";");
l_sb.AppendLine(" SQLTextList.Add(l_strModifySql);");
l_sb.AppendLine("");
l_sb.AppendLine(" //3、删除语句");
l_sb.AppendLine(" string l_strDeleteSql = \"\";");
l_sb.AppendLine(" SQLTextList.Add(l_strDeleteSql);");
l_sb.AppendLine("");
l_sb.AppendLine(" }");
l_sb.AppendLine("");
l_sb.AppendLine(" /// " );
l_sb.AppendLine(" /// 查询语句");
l_sb.AppendLine(" /// 使用条件:需引入封装类DBHelperMySQL.cs");
l_sb.AppendLine(" /// ");
l_sb.AppendLine(" /// DataTable ");
l_sb.AppendLine(" public DataTable GetData()");
l_sb.AppendLine(" {");
l_sb.AppendLine(" string l_strSql = \"select * from tb\";");
l_sb.AppendLine(" return DBHelperMySQL.Query(l_strSql).Tables[0];");
l_sb.AppendLine(" }");
l_sb.AppendLine(" }");
l_sb.AppendLine("}");
string l_strFilePath = Path.Combine(a_strDirPath, "DAL", $"{a_strTableName}DAL.cs");
ConvertDataType.FileWrite(l_sb.ToString(), l_strFilePath);
}
#endregion
#region 创建BLL业务逻辑层
public static void CreateBLL(string a_strNameSpace, string a_strTableName, string a_strDirPath)
{
StringBuilder l_sb = new StringBuilder();
l_sb.AppendLine("using System;");
l_sb.AppendLine("using System.Collections.Generic;");
l_sb.AppendLine("using System.Data;");
l_sb.AppendLine("using WBF.Utils;");
l_sb.AppendLine();
l_sb.AppendLine($"namespace {a_strNameSpace}.BLL");
l_sb.AppendLine("{");
l_sb.AppendLine(" /// ");
l_sb.AppendLine(" /// BLL业务逻辑层 t_wutiao(以下代码由工具自动生成,有错误请反馈)");
l_sb.AppendLine(" /// ");
l_sb.AppendLine($" public class {ConvertDataType.ToUpperFirstword(a_strTableName)}");
l_sb.AppendLine(" {");
l_sb.AppendLine(" //构造数据对象");
l_sb.AppendLine($" {ConvertDataType.ToUpperFirstword(a_strTableName)} {ConvertDataType.ToUpperFirstword(a_strTableName)}Model = new {ConvertDataType.ToUpperFirstword(a_strTableName)}()");
l_sb.AppendLine(" {");
var dt = DBOperation.GetDataColumns(a_strTableName).Tables["ds"];
foreach (DataRow dr in dt.Rows)
{
l_sb.Append($" {dr["column_name"].ToString()} = baseDataInput_{dr["column_name"].ToString()}.StringValue,").AppendLine();
}
l_sb.AppendLine(" };");
l_sb.AppendLine("");
l_sb.AppendLine(" //数据对象转json格式");
l_sb.AppendLine($" string l_strSend = ConvertJson.SerializeObject({ConvertDataType.ToUpperFirstword(a_strTableName)}Model);");
l_sb.AppendLine("");
l_sb.AppendLine(" //实例化消息类,定义消息ID");
l_sb.AppendLine(" BaseSuperMessage SuperMsg = new BaseSuperMessage(仓库消息_临时.钨条打标);");
l_sb.AppendLine(" //构造传递参数");
l_sb.AppendLine(" SuperMsg.Append(\"PrinterPCName\", System.Net.Dns.GetHostName());");
l_sb.AppendLine(" SuperMsg.Append(\"t_wutiao\", l_strSend);");
l_sb.AppendLine(" //向服务端发送消息");
l_sb.AppendLine(" BaseNetClient.SendSuperMessage(SuperMsg);");
l_sb.AppendLine(" }");
l_sb.AppendLine("}");
string l_strFilePath = Path.Combine(a_strDirPath, "BLL", $"{a_strTableName}BLL.cs");
ConvertDataType.FileWrite(l_sb.ToString(), l_strFilePath);
}
#endregion
}
}
private void cbo_DataBases_SelectedIndexChanged(object sender, EventArgs e)
{
this.lBC_Left.Items.Clear();
this.lBC_Right.Items.Clear();
if (this.cbo_DataBases.Text.Contains("请选择"))
{
return;
}
else
{
MySQLHelper.dataBaseName = this.cbo_DataBases.Text.Trim();//修改库
DataTable l_dtTables = DBOperation.GetDataTables();
foreach (DataRow dr in l_dtTables.Rows)
{
this.lBC_Left.Items.Add(dr["table_name"].ToString());
}
}
}
#region 按钮事件
private void sbtn_Create_Click(object sender, EventArgs e)
{
string l_strNameSpace = text_nameSpace.Text.Trim();
dxErrorProvider1.ClearErrors();
if (this.lBC_Right.Items.Count <= 0)
{
XtraMessageBox.Show("请选择要生成表!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
if (string.IsNullOrWhiteSpace(l_strNameSpace))
{
dxErrorProvider1.SetError(text_nameSpace, "命名空间不能为空!"); //必须为dev控件
text_nameSpace.Focus();
return;
}
if (!(cb_Models.Checked || cb_DAL.Checked || cb_Bll.Checked))
{
XtraMessageBox.Show("生成策略至少勾选一个!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
FolderBrowserDialog fbd = new FolderBrowserDialog();
fbd.Description = "选择代码保存目录";
fbd.SelectedPath = AppDomain.CurrentDomain.BaseDirectory;
DialogResult dialogResult = fbd.ShowDialog();
if (dialogResult == DialogResult.OK)
{
string l_strDir = Path.Combine(fbd.SelectedPath, l_strNameSpace);
foreach (string l_strTableName in lBC_Right.Items)
{
if (cb_Models.Checked)
{
CodeFactory.CreateModel(l_strNameSpace, l_strTableName, l_strDir);
}
if (cb_DAL.Checked)
{
CodeFactory.CreateDAL(l_strNameSpace, l_strTableName, l_strDir);
}
if (cb_Bll.Checked)
{
CodeFactory.CreateBLL(l_strNameSpace, l_strTableName, l_strDir);
}
}
XtraMessageBox.Show("代码生成成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
System.Diagnostics.Process.Start(l_strDir);
}
}
#endregion
我是用于MES系统开发,C/S架构,目前代码生成的很简洁,出于项目保密,我仅开放部分图:
服务器调用代码,是不是很简洁:
代码模板生成器,链接如下:
链接:https://pan.baidu.com/s/1epm6is-dJ-b1cdJwY1XvQw?pwd=30zq
提取码:30zq