系列文章

【C#】编号生成器(定义单号规则、固定字符、流水号、业务单号)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129129787

【C#】日期范围生成(构建本周开始、结束日期)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129040663

【C#】数据实体类使用
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128816638

【C#】单据审批流方案
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128972545

【C#】二维码标签制作及打印(完整版)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126884228

【C#】打印解决方案(支持打印模板、条形码、二维码、图片)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129415723

【C#】条码管理操作手册
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126589496

【C#】WebAPI发布和IIS部署,及异常处理
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126539836

【C#】提高编程效率,代码自动生成器
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126890673

【C#】提高编程效率,Excel数据导入工具
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126427323

【C#】Windows服务(Service)安装及启停方案
本文链接:https://blog.csdn.net/youcheng_ge/article/details/124053794

【C#】穿透Session隔离,服务调用外部程序(无窗体界面解决)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/124053033

【C#】任务计划实现,使用Quartz类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/123667723

【C#】《周计划管理关于产前准备模块》解决方案20200203
本文链接:https://blog.csdn.net/youcheng_ge/article/details/122919543

【C#】项目中,源码解析的正则表达式
本文链接:https://blog.csdn.net/youcheng_ge/article/details/118337074

【C#】软件版本和文件MD5记录(XML操作)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/112513871

【C#】如何测试网络是否连通
本文链接:https://blog.csdn.net/youcheng_ge/article/details/110137288

【C#】组件化开发,调用dll组件方法
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129492112

【C#】GridControl控件和List数据集双向绑定
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129423755

【Inno Setup】安装包制作,项目打包方案
本文链接:https://blog.csdn.net/youcheng_ge/article/details/123665633


文章目录

  • 系列文章
  • 更新日志
  • 前言
  • 一、问题描述
    • 1.1 原业务需求
    • 1.2 新业务需求
  • 二、解决方案
    • 2.1 可行性分析
    • 2.2 采用方案
    • 2.3 方案补充
  • 三、软件开发(项目源码)
    • 3.1 创建WebAPI项目
    • 3.2 创建数据实体
    • 3.3 创建自动编号客户端(V1.0)
    • 3.4 创建自动编号客户端(V2.0)
    • 3.5 创建数据库操作类
    • 3.6 创建字符串操作类
    • 3.7 编写API控制器
  • 四、运行效果
    • 4.1 调用方式
    • 4.2 参数说明
    • 4.3 项目展示
  • 五、资源链接
    • 5.1 数据库脚本

更新日志

版本 更新日期 更新说明
V1.0 2023-02-20 首次发布自动编号生成器
V1.1 2023-03-15 未更新代码,仅仅调整文章章节,使之更清晰
V2.0 2023-03-21 原编号规则–流水号位数,采用分号分割。因新业务需求,我需要在编码中传入【参数】,我没有特殊字符识别这类,需要改造流水号位数。见3.4 创建自动编号客户端(V2.0)

前言

我能抽象出整个世界,但是我不能抽象你。 想让你成为私有常量,这样外部函数就无法访问你。 又想让你成为全局常量,这样在我的整个生命周期都可以调用你。 可惜世上没有这样的常量,我也无法定义你,因为你在我心中是那么的具体。

哈喽大家好,本专栏为【项目实战】专栏,有别于【底层库】专栏,我们可以发现增加 了『问题描述』、『项目展示』章节,十分符合项目开发流程,让读者更加清楚项目解决的问题、以及产品能够达到的效果。本专栏收纳项目开发过程的解决方案,是我项目开发相对成熟、可靠方法的提炼,我将这些问题的解决思路梳理,撰写本文分享给大家,大家遇到类似问题,可按本文方案处理。

本专栏会持续更新,不断完善,专栏文章关联性较弱(文章之间依赖性较弱,没有阅读顺序)。大家有任何问题,可以私信我。如果您对本专栏感兴趣,欢迎关注吧,我将带你用最简洁的代码,实现复杂的功能。

·提示:本专栏为项目实战篇,未接触项目开发的同学可能理解困难,不推荐阅读。


一、问题描述

1.1 原业务需求

我所在的公司为生产型公司,所以我的解决方案均来自于业务,并服务于业务。公司各部门运营会产生各种各样的单据,而这些单据标识需要用到“编号”。比如:销售订单–销售订单号、采购订单–采购订单号、材料入库单–入库单号、原材料出库单–出库单号、财务凭证单–凭证单号、成品发货单–物流单号等。

业务单据号,可不是你想象的那么简单?当然你也可以用随机数Guid、自增标识ID实现的。但是,业务部门未必认可这样的编号。好的业务单号设计,业务员看到他们的单据号(部门自定义单据编号规则),就能够对业务进行分类,知道这个单据应该走哪类处理流程。

显然,单纯的随机数、自增id,无法实现这样的效果。

提示:这是业务部门给出的部分编号规则,,只是物料部分。

1.2 新业务需求

公司物理实验室,需要对物料进行质检,取样命名了一个“样品编号”,但是这个编号的规则,需要能够关联“原物料”。
故而,我们的“样品编号”,要包含“物料编号”,这样就可以提现这一层关系。我想采用【参数】的形式,直接把原物料的编号传入,编号规则中。
业务部门提供的样品编码规则,中间部分为“物料编号”。

样品标签,样式:

二、解决方案

2.1 可行性分析

如上图所示,业务部门给出的“编号规则”,基本是 固定字符+流水号 的形式。这是最简单的版本,如果再复杂一点,可以细分为 固定字符+日期缩写+流水号。再进行复杂一点,又可以分为 固定字符+类型(获取系统参数)+日期缩写+员工代号+流水号等等。

那么我们的处理必然要区分“编号组成”,分开处理,采用字符串拼接的方式。固定字符,保留;流水号是数值类型(1,2,3,4,5…),需要先取得上一次的数值,执行+1操作;类型,获取系统参数,解决思路从用户登录信息、功能模块操作记录、点击事件中抓取数据。

所以,我们要解决的核心问题:要先获取上一次单据号,看流水号排到多少了,然后才能进行+1操作。我们就要查询数据库业务表,获得最大的流水号是多少。

2.2 采用方案

我们作为软件设计师,不能让程序员这么在代码里写大量取数,拼接字符串,这么瞎搞。这对于他们的工作量太大了,而且他们很容易出错,就算他们不出错。退一步来说,如果对于业务部门,哪天业务调整了,编号要变化,你是不是又要改程序?这显然太麻烦了。

所以我为了解决这个问题,我想开发一个专门的服务,统一生成这么个编号。

我将这服务通用化,对平台、开发语言的依赖要尽可能低,就是说,无论你用 电脑、平板、手机、浏览器还是以后的什么设备,都可以获取我的“自动编号”。

解决方案:①创建API应用接口 ②编写自动编号生成器 ③部署服务 ④客户端调用,获取自动编号。

2.3 方案补充

解决编号【参数】问题,不需要在编码规则中提现。

public const string 钨条样编号规则 = “WT-{0}-[2位流水号]”;
string.Format(编号规则.钨条样编号规则,item.钨条编号)

三、软件开发(项目源码)

3.1 创建WebAPI项目

Visual Studio创建WebAPI项目,引入《MySQL数据库访问操作辅助类(推荐阅读)》、《C#底层库–字符串操作类》源码,具体可以看我的《C#底层库》专栏。
提示:C#底层库专栏,包含开发中最最基础的辅助库,源码已定稿不需要变动。

3.2 创建数据实体

创建类AutoCodeRuleModel.cs,作为 传入的参数实体,复制以下代码:

using System;namespace DLMESWebAPI
{public class AutoCodeRuleModel{public string 编号规则 { get; set; } //自动编号规则public string 表 { get; set; } //数据库表public string 字段 { get; set; } //表字段}
}

3.3 创建自动编号客户端(V1.0)

创建类 AutoCodeClient.cs,用于自动编号生成,是核心方法,复制以下代码:

using BaseClass_NameSpace;
using System;
using System.Data;namespace DLMESWebAPI.BLL
{public class AutoCodeClient{/// <summary>/// 获取自动编号/// </summary>/// <param name="a_strAutoRule">编号规则</param>/// <param name="a_strCodeTable">表名</param>/// <param name="a_strCodeField">字段名</param>/// <returns></returns>public static string GetAutoCode(string a_strAutoRule, string a_strCodeTable, string a_strCodeField){int a_CodeLength = 4;string[] array = a_strAutoRule.Split(new char[]{',',';'});if (array.Length > 1) //编号规则是否定义了流水号位数。{int.TryParse(array[1], out a_CodeLength);return AutoCodeClient.GetAutoCode(array[0], a_CodeLength, a_strCodeTable, a_strCodeField);}return AutoCodeClient.GetAutoCode(a_strAutoRule, a_CodeLength, a_strCodeTable, a_strCodeField);}public static string GetAutoCode(string a_strAutoRule, int a_CodeLength, string a_strCodeTable, string a_strCodeField){string text = "";string text2 = "";checked{for (int i = 0; i < a_CodeLength; i++){text += "_";text2 += "0";}string text3 = AutoCodeClient.ParseCodeRule(a_strAutoRule, a_CodeLength);string s = AutoCodeClient.ParseQueryRule(a_strAutoRule, a_CodeLength);int num = text3.IndexOf(text);MySQLHelper fetchData = new MySQLHelper();string text4 = "select {0} from {1} where {2} like {3} order by 1 desc LIMIT 0,1";text4 = string.Format(text4, new object[]{string.Format("SUBSTRING({0}, {1}, {2})", a_strCodeField, num + 1, a_CodeLength),a_strCodeTable,a_strCodeField,s.QuotedStr()});DataTable l_dt = fetchData.Query(text4).Tables[0];if (l_dt!=null){string newValue;if (l_dt.Rows.Count<=0){newValue = 1.ToString(text2);}else{text3.Substring(0, num);if (text3.Length > num + 4){text3.Substring(num + 4);}string s2 = l_dt.Rows[0][0].ToString();int num2 = 0;int.TryParse(s2, out num2);num2++;newValue = num2.ToString(text2);}text3 = text3.Replace(text, newValue);}return text3;}}public static string GetAutoCodeAlpha(string a_strAutoRule, string a_strCodeTable, string a_strCodeField){int num = 1;string text = "";string str = "";checked{for (int i = 0; i < num; i++){text += "_";str += "0";}string text2 = AutoCodeClient.ParseCodeRule(a_strAutoRule, num);string s = AutoCodeClient.ParseQueryRule(a_strAutoRule, num);int num2 = text2.IndexOf(text);//BaseMySQL fetchData = new BaseMySQL();MySQLHelper fetchData = new MySQLHelper();string text3 = "select top 1 {0} from {1} where {2} like {3} order by 1 desc";text3 = string.Format(text3, new object[]{string.Format("SUBSTRING({0}, {1}, {2})", a_strCodeField, num2 + 1, num),a_strCodeTable,a_strCodeField,s.QuotedStr()});DataTable l_dt = fetchData.Query(text3).Tables[0];if (l_dt!=null){string newValue;if (l_dt.Rows.Count<=0){newValue = "A";}else{text2.Substring(0, num2);if (text2.Length > num2 + 4){text2.Substring(num2 + 4);}string text4 = l_dt.Rows[0][0].ToString();int num3 = 65;if (text4.Length > 0){num3 = (int)text4[0];}num3++;if (num3 > 90){return AutoCodeClient.GetAutoCodeAlpha2(a_strAutoRule, a_strCodeTable, a_strCodeField);}newValue = Convert.ToString((char)num3);}text2 = text2.Replace(text, newValue);}return text2;}}private static string GetAutoCodeAlpha2(string a_strAutoRule, string a_strCodeTable, string a_strCodeField){int num = 2;string text = "";string str = "";checked{for (int i = 0; i < num; i++){text += "_";str += "0";}string text2 = AutoCodeClient.ParseCodeRule(a_strAutoRule, num);string s = AutoCodeClient.ParseQueryRule(a_strAutoRule, num);int num2 = text2.IndexOf(text);//BaseMySQL fetchData = new BaseMySQL();MySQLHelper fetchData = new MySQLHelper();string text3 = "select top 1 {0} from {1} where {2} like {3} order by 1 desc";text3 = string.Format(text3, new object[]{string.Format("SUBSTRING({0}, {1}, {2})", a_strCodeField, num2 + 1, num),a_strCodeTable,a_strCodeField,s.QuotedStr()});DataTable l_dt = fetchData.Query(text3).Tables[0];if (l_dt!=null){string newValue;if (l_dt.Rows.Count<=0){newValue = "AA";}else{string input = l_dt.Rows[0][0].ToString();newValue = AutoCodeClient.IncAlphaCode(input);}text2 = text2.Replace(text, newValue);}return text2;}}private static string IncAlphaCode(string input){char c = input[0];char c2 = input[1];int num = (int)c;int num2 = (int)c2;checked{if (num2 < 90){return Convert.ToString((char)num) + Convert.ToString((char)(num2 + 1));}return Convert.ToString((char)(num + 1)) + "A";}}private static string ParseCodeRule(string a_strAutoRule, int a_CodeLength){DateTime date = DateTime.Now.Date;if (a_strAutoRule.Contains("[紧缩天数]")){a_strAutoRule = a_strAutoRule.Replace("[紧缩天数]", date.Day.ToString());}if (a_strAutoRule.Contains("[两位天数]")){a_strAutoRule = a_strAutoRule.Replace("[两位天数]", date.Day.ToString("00"));}if (a_strAutoRule.Contains("[紧缩月份]")){a_strAutoRule = a_strAutoRule.Replace("[两位月份]", date.Month.ToString());}if (a_strAutoRule.Contains("[两位月份]")){a_strAutoRule = a_strAutoRule.Replace("[两位月份]", date.Month.ToString("00"));}checked{if (a_strAutoRule.Contains("[一位年份]")){a_strAutoRule = a_strAutoRule.Replace("[一位年份]", date.Year.ToString().Substring(date.Year.ToString().Length - 1, 1));}if (a_strAutoRule.Contains("[两位年份]")){a_strAutoRule = a_strAutoRule.Replace("[两位年份]", date.Year.ToString().Substring(date.Year.ToString().Length - 2, 2));}if (a_strAutoRule.Contains("[四位年份]")){a_strAutoRule = a_strAutoRule.Replace("[四位年份]", date.Year.ToString("0000"));}string text2 = "";for (int i = 0; i < a_CodeLength; i++){text2 += "_";}a_strAutoRule = a_strAutoRule.Replace("[流水编号]", text2);a_strAutoRule = a_strAutoRule.Replace("[按月编号]", text2);a_strAutoRule = a_strAutoRule.Replace("[按年编号]", text2);return a_strAutoRule;}}private static string ParseQueryRule(string a_strAutoRule, int a_CodeLength){DateTime date = DateTime.Now.Date;if (a_strAutoRule.Contains("[紧缩天数]")){a_strAutoRule = a_strAutoRule.Replace("[紧缩天数]", date.Day.ToString());}if (a_strAutoRule.Contains("[两位天数]")){if (a_strAutoRule.Contains("[按月编号]") || a_strAutoRule.Contains("[按年编号]")){a_strAutoRule = a_strAutoRule.Replace("[两位天数]", "__");}else{a_strAutoRule = a_strAutoRule.Replace("[两位天数]", date.Day.ToString("00"));}}if (a_strAutoRule.Contains("[紧缩月份]")){a_strAutoRule = a_strAutoRule.Replace("[两位月份]", date.Month.ToString());}if (a_strAutoRule.Contains("[两位月份]")){if (a_strAutoRule.Contains("[按年编号]")){a_strAutoRule = a_strAutoRule.Replace("[两位月份]", "__");}else{a_strAutoRule = a_strAutoRule.Replace("[两位月份]", date.Month.ToString("00"));}}checked{if (a_strAutoRule.Contains("[一位年份]")){a_strAutoRule = a_strAutoRule.Replace("[一位年份]", date.Year.ToString().Substring(date.Year.ToString().Length - 1, 1));}if (a_strAutoRule.Contains("[两位年份]")){a_strAutoRule = a_strAutoRule.Replace("[两位年份]", date.Year.ToString().Substring(date.Year.ToString().Length - 2, 2));}if (a_strAutoRule.Contains("[四位年份]")){a_strAutoRule = a_strAutoRule.Replace("[四位年份]", date.Year.ToString("0000"));}string text2 = "";for (int i = 0; i < a_CodeLength; i++){text2 += "_";}a_strAutoRule = a_strAutoRule.Replace("[流水编号]", text2);a_strAutoRule = a_strAutoRule.Replace("[按月编号]", text2);a_strAutoRule = a_strAutoRule.Replace("[按年编号]", text2);return a_strAutoRule;}}}
}

3.4 创建自动编号客户端(V2.0)

AutoCodeClient.cs,代码进行了修改。引入了正则表达式,数据库取数部分进行再次封装(你们可以不用修改MySQLHelper数据库操作部分),这些在我的【底层库】专栏均有介绍。
其中,我们碰到的问题,我想了以下不必要增加【参数】,因为我这个自动编号产生器,固定值是不进行替换的,所以我完全可以把规则定义成{0},使用 string.Format()实现。

以下是修改后的代码:

using BaseClass_NameSpace;
using System;
using System.Data;
using System.Text.RegularExpressions;namespace WBF.Utils
{/// <summary>/// 自动编号客户端/// 创建人:gyc/// 创建时间:2022-11-16/// 备注:流水号经过压力测试,位数可以任意/// </summary>public class AutoCodeClient{//实在不适合字符串分割,所以我引入了强大的正则public const string 流水号正则 = @"(\[[0-9]+位流水号])";public const string 流水号位数正则 = "[0-9]+";/// <summary>/// 获取自动编号/// </summary>/// <param name="a_strAutoRule">编号规则</param>/// <param name="a_strCodeTable">表名</param>/// <param name="a_strCodeField">数据库表字段,存储编号的字段</param>/// <returns></returns>public static string AutoCode(string a_strAutoRule, string a_strCodeTable, string a_strCodeField){string l_strSNText = RegexForString(流水号正则, a_strAutoRule);//流水号文本int l_intSNLength = 4;//流水号长度string l_strSN = RegexForString(流水号位数正则, l_strSNText);int.TryParse(l_strSN, out l_intSNLength);//string[] array = a_strAutoRule.Split(new char[]//{//    ';'//});//if (array.Length > 1) //编号规则是否定义了流水号位数。//{//    int.TryParse(array[1], out l_intSNLength);//    return AutoCodeClient.GetAutoCode(array[0], l_intSNLength, a_strCodeTable, a_strCodeField);//}return AutoCodeClient.GetAutoCode(a_strAutoRule, l_strSNText, l_intSNLength, a_strCodeTable, a_strCodeField);}/// <summary>/// 获取自动编号/// </summary>/// <param name="a_strAutoRule">编号规则</param>/// <param name="a_strSNText">d位流水号</param>/// <param name="a_intSNLength">d</param>/// <param name="a_strCodeTable">数据库表</param>/// <param name="a_strCodeField">数据库表字段,存储编号的字段</param>/// <returns></returns>public static string GetAutoCode(string a_strAutoRule,string a_strSNText, int a_intSNLength, string a_strCodeTable, string a_strCodeField){string text = "";string text2 = "";checked{for (int i = 0; i < a_intSNLength; i++){text += "_";text2 += "0";}string text3 = AutoCodeClient.ParseCodeRule(a_strAutoRule, a_strSNText, a_intSNLength);string s = AutoCodeClient.ParseQueryRule(a_strAutoRule, a_strSNText, a_intSNLength);int num = text3.IndexOf(text);//使用 BaseMySQL取数,需要指定 数据库名//MySQLHelper fetchData = new MySQLHelper();BaseMySQL fetchData = new BaseMySQL();string text4 = "select {0} from {1} where {2} like {3} order by 1 desc LIMIT 0,1";text4 = string.Format(text4, new object[]{string.Format("SUBSTRING({0}, {1}, {2})", a_strCodeField, num + 1, a_intSNLength),a_strCodeTable,a_strCodeField,s.QuotedStr()});//DataTable l_dt = fetchData.Query(text4).Tables[0];DataTable l_dt = fetchData.Query(text4);if (l_dt!=null){string newValue;if (l_dt.Rows.Count<=0){newValue = 1.ToString(text2);}else{text3.Substring(0, num);if (text3.Length > num + 4){text3.Substring(num + 4);}string s2 = l_dt.Rows[0][0].ToString();int num2 = 0;int.TryParse(s2, out num2);num2++;newValue = num2.ToString(text2);}text3 = text3.Replace(text, newValue);}return text3;}}private static string ParseCodeRule(string a_strAutoRule, string a_strSNText, int a_CodeLength){DateTime date = DateTime.Now.Date;if (a_strAutoRule.Contains("[紧缩天数]")){a_strAutoRule = a_strAutoRule.Replace("[紧缩天数]", date.Day.ToString());}if (a_strAutoRule.Contains("[两位天数]")){a_strAutoRule = a_strAutoRule.Replace("[两位天数]", date.Day.ToString("00"));}if (a_strAutoRule.Contains("[紧缩月份]")){a_strAutoRule = a_strAutoRule.Replace("[两位月份]", date.Month.ToString());}if (a_strAutoRule.Contains("[两位月份]")){a_strAutoRule = a_strAutoRule.Replace("[两位月份]", date.Month.ToString("00"));}checked{if (a_strAutoRule.Contains("[一位年份]")){a_strAutoRule = a_strAutoRule.Replace("[一位年份]", date.Year.ToString().Substring(date.Year.ToString().Length - 1, 1));}if (a_strAutoRule.Contains("[两位年份]")){a_strAutoRule = a_strAutoRule.Replace("[两位年份]", date.Year.ToString().Substring(date.Year.ToString().Length - 2, 2));}if (a_strAutoRule.Contains("[四位年份]")){a_strAutoRule = a_strAutoRule.Replace("[四位年份]", date.Year.ToString("0000"));}string text2 = "";for (int i = 0; i < a_CodeLength; i++){text2 += "_";}a_strAutoRule = a_strAutoRule.Replace(a_strSNText, text2);a_strAutoRule = a_strAutoRule.Replace("[按月编号]", text2);a_strAutoRule = a_strAutoRule.Replace("[按年编号]", text2);return a_strAutoRule;}}private static string ParseQueryRule(string a_strAutoRule, string a_strSNText, int a_CodeLength){DateTime date = DateTime.Now.Date;if (a_strAutoRule.Contains("[紧缩天数]")){a_strAutoRule = a_strAutoRule.Replace("[紧缩天数]", date.Day.ToString());}if (a_strAutoRule.Contains("[两位天数]")){if (a_strAutoRule.Contains("[按月编号]") || a_strAutoRule.Contains("[按年编号]")){a_strAutoRule = a_strAutoRule.Replace("[两位天数]", "__");}else{a_strAutoRule = a_strAutoRule.Replace("[两位天数]", date.Day.ToString("00"));}}if (a_strAutoRule.Contains("[紧缩月份]")){a_strAutoRule = a_strAutoRule.Replace("[两位月份]", date.Month.ToString());}if (a_strAutoRule.Contains("[两位月份]")){if (a_strAutoRule.Contains("[按年编号]")){a_strAutoRule = a_strAutoRule.Replace("[两位月份]", "__");}else{a_strAutoRule = a_strAutoRule.Replace("[两位月份]", date.Month.ToString("00"));}}checked{if (a_strAutoRule.Contains("[一位年份]")){a_strAutoRule = a_strAutoRule.Replace("[一位年份]", date.Year.ToString().Substring(date.Year.ToString().Length - 1, 1));}if (a_strAutoRule.Contains("[两位年份]")){a_strAutoRule = a_strAutoRule.Replace("[两位年份]", date.Year.ToString().Substring(date.Year.ToString().Length - 2, 2));}if (a_strAutoRule.Contains("[四位年份]")){a_strAutoRule = a_strAutoRule.Replace("[四位年份]", date.Year.ToString("0000"));}string text2 = "";for (int i = 0; i < a_CodeLength; i++){text2 += "_";}a_strAutoRule = a_strAutoRule.Replace(a_strSNText, text2);a_strAutoRule = a_strAutoRule.Replace("[按月编号]", text2);a_strAutoRule = a_strAutoRule.Replace("[按年编号]", text2);return a_strAutoRule;}}/// <summary>/// 匹配返回string/// </summary>/// <param name="a_strPattern">正则表达式</param>/// <param name="a_txtContext">匹配文本</param>/// <returns></returns>private static string RegexForString(string a_strPattern, string a_txtContext){Regex l_reg = new Regex(@a_strPattern, RegexOptions.IgnoreCase);MatchCollection matches_Type = l_reg.Matches(a_txtContext);foreach (Match item in matches_Type){return item.Value;}return "";}}
}

3.5 创建数据库操作类

创建数据库操作类 MySQLHelper.cs,本代码已经收纳在《C#底层库》专栏,我复制了一下。

using System;
using System.Data;
using MySql.Data.MySqlClient;
using System.Collections.Generic;
using DLMESWebAPI.Core;namespace DLMESWebAPI
{public class MySQLHelper{public string server { get; set; }public string port { get; set; }public string uid { get; set; }public string pwd { get; set; }public string BaseName { get; set; }public string connectionString { get; set; }/// <summary>/// 构造函数/// </summary>public MySQLHelper(){this.server = AppConfig.GetValue("db_server");this.port = AppConfig.GetValue("db_port");this.BaseName = AppConfig.GetValue("db_base");this.uid = AppConfig.GetValue("db_uid");this.pwd = AppConfig.GetValue("db_pwd");//MySQL.Data 8.0.28.0//this.connectionString = $"server={server};port={port};user id={uid};password={pwd};database={BaseName};pooling=true;ConnectionTimeout=1800;CharSet=utf8";//MySQL.Data 8.0.26.0this.connectionString = $"server={server};port={port};uid={uid};pwd={pwd};database={BaseName};SslMode=None;Charset=utf8";}/// <summary>/// 构造函数/// </summary>public MySQLHelper(string server, string port, string uid, string pwd, string BaseName){this.server = server;this.port = port;this.BaseName = BaseName;this.uid = uid;this.pwd = pwd;this.connectionString = $"server={server};uid={uid};pwd={pwd};database={BaseName};SslMode=None;charset=utf8";}#region 公用方法public bool Test(){string l_strSQL = "select 1 ";using (MySqlConnection connection = new MySqlConnection(connectionString)){using (MySqlCommand cmd = new MySqlCommand(l_strSQL, connection)){try{connection.Open();object obj = cmd.ExecuteScalar();if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))){return false;}else{return true;}}catch (MySqlException e){connection.Close();throw e;}}}}/// <summary>/// 查询表是否存在/// </summary>/// <param name="strTableName">表名</param>/// <returns>bool</returns>public bool Exists(string strTableName){string l_strSQL = "SHOW TABLES LIKE '" + strTableName+"'";using (MySqlConnection connection = new MySqlConnection(connectionString)){using (MySqlCommand cmd = new MySqlCommand(l_strSQL, connection)){try{connection.Open();object obj = cmd.ExecuteScalar();if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))){return false;}else{return true;}}catch (MySqlException e){connection.Close();throw e;}}}}/// <summary>/// 查询数据是否存在,带参数/// </summary>/// <param name="strSql">查询语句</param>/// <param name="cmdParms">参数列表</param>/// <returns></returns>public bool Exists(string strSql, params MySqlParameter[] cmdParms){using (MySqlConnection connection = new MySqlConnection(connectionString)){using (MySqlCommand cmd = new MySqlCommand(strSql, connection)){cmd.Parameters.AddRange(cmdParms);try{connection.Open();object obj = cmd.ExecuteScalar();if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))){return false;}else{return true;}}catch (MySqlException e){connection.Close();throw e;}}}}/// <summary>/// 获取表中字段的最大值/// </summary>/// <param name="FieldName">列名</param>/// <param name="TableName">表名</param>/// <returns></returns>public int GetMaxID(string FieldName, string TableName){string strsql = "select max(" + FieldName + ")+1 from " + TableName;using (MySqlConnection connection = new MySqlConnection(connectionString)){using (MySqlCommand cmd = new MySqlCommand(strsql, connection)){try{connection.Open();object obj = cmd.ExecuteScalar();if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))){return 1;}else{return int.Parse(obj.ToString()); ;}}catch (MySqlException e){connection.Close();throw e;}}}}/// <summary>/// 执行查询语句,无参数,返回DataSet/// </summary>/// <param name="SQLString">查询语句</param>/// <returns>DataSet</returns>public DataSet ShowDataBases(string SQLString){string l_str = $"server={server};uid={uid};pwd={pwd};SslMode=None;";using (MySqlConnection connection = new MySqlConnection(l_str)){DataSet ds = new DataSet();try{connection.Open();MySqlDataAdapter command = new MySqlDataAdapter(SQLString, connection);command.Fill(ds, "ds");}catch (MySqlException ex){throw new Exception(ex.Message);}return ds;}}#endregion#region  执行简单SQL语句/// <summary>/// 执行SQL语句,返回影响的记录数/// </summary>/// <param name="SQLString">SQL语句</param>/// <returns>影响的记录数</returns>public int ExecuteSql(string SQLString){using (MySqlConnection connection = new MySqlConnection(connectionString)){using (MySqlCommand cmd = new MySqlCommand(SQLString, connection)){try{connection.Open();int rows = cmd.ExecuteNonQuery();return rows;}catch (MySqlException e){connection.Close();throw e;}}}}/// <summary>/// 执行SQL语句(带特殊文本),返回影响的记录数/// </summary>/// <param name="SQLString">SQL语句</param>/// <param name="strParamText">参数内容</param>/// <returns>影响的记录数</returns>public int ExecuteSql(string SQLString, string strParamText){using (MySqlConnection connection = new MySqlConnection(connectionString)){MySqlCommand cmd = new MySqlCommand(SQLString, connection);MySqlParameter myParameter = new MySqlParameter("@content", SqlDbType.NText);myParameter.Value = strParamText;cmd.Parameters.Add(myParameter);try{connection.Open();int rows = cmd.ExecuteNonQuery();return rows;}catch (MySqlException e){throw e;}finally{cmd.Dispose();connection.Close();}}}/// <summary>/// 执行SQL语句(带参数),返回影响的记录数/// </summary>/// <param name="SQLString">SQL语句</param>/// <param name="cmdParms">准备好的参数列表</param>/// <returns>影响的记录数</returns>public int ExecuteSql(string SQLString, params MySqlParameter[] cmdParms){using (MySqlConnection connection = new MySqlConnection(connectionString)){using (MySqlCommand cmd = new MySqlCommand()){try{PrepareCommand(cmd, connection, null, SQLString, cmdParms);int rows = cmd.ExecuteNonQuery();cmd.Parameters.Clear();return rows;}catch (MySqlException e){throw e;}}}}/// <summary>/// 指定时间执行,返回影响行数/// </summary>/// <param name="SQLString">执行语句</param>/// <param name="Times">指定时间</param>/// <returns>影响的记录数</returns>public int ExecuteSqlByTime(string SQLString, int Times){using (MySqlConnection connection = new MySqlConnection(connectionString)){using (MySqlCommand cmd = new MySqlCommand(SQLString, connection)){try{connection.Open();cmd.CommandTimeout = Times;int rows = cmd.ExecuteNonQuery();return rows;}catch (MySqlException e){connection.Close();throw e;}}}}/// <summary>/// 批量执行SQL语句,实现数据库事务,返回执行行数。/// </summary>/// <param name="SQLTextList">多条SQL语句</param>        public int ExecuteSqlTran(List<String> SQLTextList){using (MySqlConnection conn = new MySqlConnection(connectionString)){conn.Open();MySqlCommand cmd = new MySqlCommand();MySqlTransaction tx = conn.BeginTransaction();cmd.Transaction = tx;try{int count = 0;for (int n = 0; n < SQLTextList.Count; n++){string strsql = SQLTextList[n];if (strsql.Trim().Length > 1){cmd.CommandText = strsql;count += cmd.ExecuteNonQuery();}}tx.Commit();return count;}catch{tx.Rollback();return 0;}}}/// <summary>/// 向数据库里插入图像格式的字段(和上面情况类似的另一种实例)/// </summary>/// <param name="strSQL">SQL语句</param>/// <param name="fs">图像字节,数据库的字段类型为image的情况</param>/// <returns>影响的记录数</returns>public int ExecuteSqlInsertImg(string strSQL, byte[] fs){using (MySqlConnection connection = new MySqlConnection(connectionString)){MySqlCommand cmd = new MySqlCommand(strSQL, connection);MySqlParameter myParameter = new MySqlParameter("@fs", SqlDbType.Image);myParameter.Value = fs;cmd.Parameters.Add(myParameter);try{connection.Open();int rows = cmd.ExecuteNonQuery();return rows;}catch (MySqlException e){throw e;}finally{cmd.Dispose();connection.Close();}}}//执行单条插入语句,并返回id,不需要返回id的用ExceuteNonQuery执行。/// <summary>/// 执行插入语句并返回Id,不需返回Id的用其它执行方法/// </summary>/// <param name="strSql">Sql语句</param>/// <param name="parameters">此参数为Null时进行</param>/// <returns></returns>public int ExecuteInsert(string strSql, MySqlParameter[] parameters){using (MySqlConnection connection = new MySqlConnection(connectionString)){MySqlCommand cmd = new MySqlCommand(strSql, connection);try{connection.Open();if (parameters != null) cmd.Parameters.AddRange(parameters);cmd.ExecuteNonQuery();cmd.CommandText = @"select LAST_INSERT_ID()";//此方法估计也可直接用  select   @@identity 获得,两值基本都是全局服务,使用时不能关闭Connectionint value = Int32.Parse(cmd.ExecuteScalar().ToString());return value;}catch (Exception e){throw e;}}}/// <summary>/// 无参查询语句,返回MySqlDataReader ( 注意:调用该方法后,一定要对MySqlDataReader进行Close )/// </summary>/// <param name="strSqlText">查询语句</param>/// <returns>MySqlDataReader</returns>public MySqlDataReader ExecuteReader(string strSqlText){MySqlConnection conn = new MySqlConnection(connectionString);MySqlCommand cmd = new MySqlCommand(strSqlText, conn);try{conn.Open();MySqlDataReader myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);return myReader;}catch (MySqlException e){throw e;}}/// <summary>///  带参查询语句,返回MySqlDataReader ( 注意:调用该方法后,一定要对MySqlDataReader进行Close )/// </summary>/// <param name="strSqlText">查询语句</param>/// <param name="cmdParas">参数列表</param>/// <returns>MySqlDataReader</returns>public MySqlDataReader ExecuteReader(string strSqlText, params MySqlParameter[] cmdParas){MySqlConnection connection = new MySqlConnection(connectionString);MySqlCommand cmd = new MySqlCommand();try{PrepareCommand(cmd, connection, null, strSqlText, cmdParas);MySqlDataReader myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);//不加using,执行conn关闭后自动关闭Readercmd.Parameters.Clear();return myReader;}catch (MySqlException e){throw e;}}/// <summary>/// 执行查询语句,无参数,返回DataSet/// </summary>/// <param name="SQLString">查询语句</param>/// <returns>DataSet</returns>public DataSet Query(string SQLString){using (MySqlConnection connection = new MySqlConnection(connectionString)){DataSet ds = new DataSet();try{connection.Open();MySqlDataAdapter command = new MySqlDataAdapter(SQLString, connection);command.Fill(ds, "ds");}catch (MySqlException ex){throw new Exception(ex.Message);}return ds;}}/// <summary>/// 执行语句,返回DataSet/// </summary>/// <param name="SQLString">Sql语句</param>/// <param name="Times">执行时间</param>/// <returns></returns>public DataSet Query(string SQLString, int Times){using (MySqlConnection connection = new MySqlConnection(connectionString)){DataSet ds = new DataSet();try{connection.Open();MySqlDataAdapter command = new MySqlDataAdapter(SQLString, connection);command.Fill(ds, "ds");}catch (MySqlException ex){throw new Exception(ex.Message);}return ds;}}/// <summary>/// 带参查询语句,返回DataSet/// </summary>/// <param name="SQLString">查询语句</param>/// <param name="cmdParms">参数列表</param>/// <returns>DataSet</returns>public DataSet Query(string SQLString, params MySqlParameter[] cmdParms){using (MySqlConnection connection = new MySqlConnection(connectionString)){MySqlCommand cmd = new MySqlCommand();PrepareCommand(cmd, connection, null, SQLString, cmdParms);using (MySqlDataAdapter da = new MySqlDataAdapter(cmd)){DataSet ds = new DataSet();try{da.Fill(ds, "ds");cmd.Parameters.Clear();}catch (MySqlException ex){throw new Exception(ex.Message);}return ds;}}}/// <summary>/// 准备命令语句/// </summary>/// <param name="cmd">Command命令</param>/// <param name="conn">Connection对象</param>/// <param name="trans">是否是事务</param>/// <param name="cmdText">语句</param>/// <param name="cmdParms">参数列表</param>private void PrepareCommand(MySqlCommand cmd, MySqlConnection conn, MySqlTransaction trans, string cmdText, MySqlParameter[] cmdParms){if (conn.State != ConnectionState.Open)conn.Open();cmd.Connection = conn;cmd.CommandText = cmdText;if (trans != null)cmd.Transaction = trans;cmd.CommandType = CommandType.Text;//cmdType;if (cmdParms != null){foreach (MySqlParameter parameter in cmdParms){if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&(parameter.Value == null)){parameter.Value = DBNull.Value;}cmd.Parameters.Add(parameter);}}}#endregion#region 参数转换/// <summary>/// 准备MysqlCommad参数/// </summary>/// <param name="cmd">MySqlCommand cmd对象</param>/// <param name="conn">MySqlConnection conn对象</param>/// <param name="trans">数据库事务</param>/// <param name="cmdType">text or StoredProcedure</param>/// <param name="cmdText">存储过程名</param>/// <param name="cmdParms">SqlCommand的参数</param>private void PrepareMySqlCommand(MySqlCommand cmd, MySqlConnection conn, MySqlTransaction trans, CommandType cmdType, string cmdText, MySqlParameter[] cmdParms){//连接状态是否打开if (conn.State != ConnectionState.Open)conn.Open();cmd.Connection = conn;cmd.CommandText = cmdText;//Transact-SQL 事务if (trans != null)cmd.Transaction = trans;cmd.CommandType = cmdType;if (cmdParms != null){foreach (MySqlParameter parm in cmdParms)cmd.Parameters.Add(parm);}}/// <summary>/// 放回一个MakeMySqlParameter/// </summary>/// <param name="name">参数名字</param>/// <param name="type">参数类型</param>/// <param name="size">参数大小</param>/// <param name="value">参数值</param>/// <returns>SQLiteParameter的值</returns>public MySqlParameter MakeMySqlParameter(string name, MySqlDbType type, int size, object value){MySqlParameter parm = new MySqlParameter(name, type, size);parm.Value = value;return parm;}/// <summary>/// 创建MysqlParameter/// </summary>/// <param name="name">字段名称</param>/// <param name="type">数据类型</param>/// <param name="value">字段值</param>/// <returns>返回类型为MySqlParameter</returns>public MySqlParameter MakeMySqlParameter(string name, MySqlDbType type, object value){MySqlParameter parm = new MySqlParameter(name, type);parm.Value = value;return parm;}#endregion#region 存储过程的调用/// <summary>/// 无参存储过程,用于插入修改删除表数据,无返回值/// </summary>/// <param name="ProcText">存储过程脚本</param>public void ExecuteProc(string ProcText){using (MySqlConnection connection = new MySqlConnection(connectionString)){using (MySqlCommand cmd = new MySqlCommand(ProcText, connection)){try{cmd.CommandType = CommandType.StoredProcedure;connection.Open();cmd.ExecuteScalar();}catch (MySqlException e){connection.Close();throw new Exception(e.Message);}}}}/// <summary>/// 带参存储过程,无返回值/// </summary>/// <param name="ProcText">存储过程脚本</param>/// <param name="cmdParms">参数MySqlParameter[] cmdParms</param>public void ExecuteProc(string ProcText, params MySqlParameter[] cmdParms){using (MySqlConnection connection = new MySqlConnection(connectionString)){using (MySqlCommand cmd = new MySqlCommand()){try{cmd.CommandType = CommandType.StoredProcedure;PrepareMySqlCommand(cmd, connection, null, CommandType.StoredProcedure, ProcText, cmdParms);cmd.ExecuteScalar();}catch (MySqlException e){connection.Close();throw new Exception(e.Message);}}}}/// <summary>/// 无参存储过程,返回DataSet/// </summary>/// <param name="ProcText">存储过程脚本</param>/// <returns>返回DataSet</returns>public DataSet ExecuteProcDataset(string ProcText){using (MySqlConnection connection = new MySqlConnection(connectionString)){MySqlCommand cmd = new MySqlCommand();PrepareMySqlCommand(cmd, connection, null, CommandType.StoredProcedure, ProcText, null);using (MySqlDataAdapter da = new MySqlDataAdapter(cmd)){DataSet ds = new DataSet();try{da.Fill(ds, "ds");cmd.Parameters.Clear();}catch (MySqlException ex){throw new Exception(ex.Message);}return ds;}}}/// <summary>/// 带参存储过程,返回DataSet/// </summary>/// <param name="ProcText">存储过程名</param>/// <param name="cmdParms">参数MySqlParameter[] cmdParms</param>/// <returns>返回DataSet</returns>public DataSet ExecuteProcDataset(string ProcText, params MySqlParameter[] cmdParms){using (MySqlConnection connection = new MySqlConnection(connectionString)){MySqlCommand cmd = new MySqlCommand();PrepareMySqlCommand(cmd, connection, null, CommandType.StoredProcedure, ProcText, cmdParms);using (MySqlDataAdapter da = new MySqlDataAdapter(cmd)){DataSet ds = new DataSet();try{da.Fill(ds, "ds");cmd.Parameters.Clear();}catch (MySqlException ex){throw new Exception(ex.Message);}return ds;}}}#endregion#region 预留代码暂时用不上/*/// <summary>/// 执行多条SQL语句,实现数据库事务。/// </summary>/// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的MySqlParameter[])</param>public  void ExecuteSqlTran(Hashtable SQLStringList){using (MySqlConnection conn = new MySqlConnection(connectionString)){conn.Open();using (MySqlTransaction trans = conn.BeginTransaction()){MySqlCommand cmd = new MySqlCommand();try{//循环foreach (DictionaryEntry myDE in SQLStringList){string cmdText = myDE.Key.ToString();MySqlParameter[] cmdParms = (MySqlParameter[])myDE.Value;PrepareCommand(cmd, conn, trans, cmdText, cmdParms);int val = cmd.ExecuteNonQuery();cmd.Parameters.Clear();}trans.Commit();}catch{trans.Rollback();throw;}}}}/// <summary>/// 执行多条语句,实现数据库事务/// </summary>/// <param name="cmdList">SQL语句的泛式表(key为sql语句,value是该语句的MySqlParameter[])</param>/// <returns>返回影响行数</returns>public  int ExecuteSqlTran(List<CommandInfo> cmdList){using (MySqlConnection conn = new MySqlConnection(connectionString)){conn.Open();using (MySqlTransaction trans = conn.BeginTransaction()){MySqlCommand cmd = new MySqlCommand();try{int count = 0;//循环foreach (CommandInfo myDE in cmdList){string cmdText = myDE.CommandText;MySqlParameter[] cmdParms = (MySqlParameter[])myDE.Parameters;PrepareCommand(cmd, conn, trans, cmdText, cmdParms);if (myDE.EffentNextType == EffentNextType.WhenHaveContine || myDE.EffentNextType == EffentNextType.WhenNoHaveContine){if (myDE.CommandText.ToLower().IndexOf("count(") == -1){trans.Rollback();return 0;}object obj = cmd.ExecuteScalar();bool isHave = false;if (obj == null && obj == DBNull.Value){isHave = false;}isHave = Convert.ToInt32(obj) > 0;if (myDE.EffentNextType == EffentNextType.WhenHaveContine && !isHave){trans.Rollback();return 0;}if (myDE.EffentNextType == EffentNextType.WhenNoHaveContine && isHave){trans.Rollback();return 0;}continue;}int val = cmd.ExecuteNonQuery();count += val;if (myDE.EffentNextType == EffentNextType.ExcuteEffectRows && val == 0){trans.Rollback();return 0;}cmd.Parameters.Clear();}trans.Commit();return count;}catch{trans.Rollback();throw;}}}}/// <summary>/// 执行多条SQL语句,实现数据库事务。/// </summary>/// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的MySqlParameter[])</param>public  void ExecuteSqlTranWithIndentity(System.Collections.Generic.List<CommandInfo> SQLStringList){using (MySqlConnection conn = new MySqlConnection(connectionString)){conn.Open();using (MySqlTransaction trans = conn.BeginTransaction()){MySqlCommand cmd = new MySqlCommand();try{int indentity = 0;//循环foreach (CommandInfo myDE in SQLStringList){string cmdText = myDE.CommandText;MySqlParameter[] cmdParms = (MySqlParameter[])myDE.Parameters;foreach (MySqlParameter q in cmdParms){if (q.Direction == ParameterDirection.InputOutput){q.Value = indentity;}}PrepareCommand(cmd, conn, trans, cmdText, cmdParms);int val = cmd.ExecuteNonQuery();foreach (MySqlParameter q in cmdParms){if (q.Direction == ParameterDirection.Output){indentity = Convert.ToInt32(q.Value);}}cmd.Parameters.Clear();}trans.Commit();}catch{trans.Rollback();throw;}}}}/// <summary>/// 执行多条SQL语句,实现数据库事务。/// </summary>/// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的MySqlParameter[])</param>public  void ExecuteSqlTranWithIndentity(Hashtable SQLStringList){using (MySqlConnection conn = new MySqlConnection(connectionString)){conn.Open();using (MySqlTransaction trans = conn.BeginTransaction()){MySqlCommand cmd = new MySqlCommand();try{int indentity = 0;//循环foreach (DictionaryEntry myDE in SQLStringList){string cmdText = myDE.Key.ToString();MySqlParameter[] cmdParms = (MySqlParameter[])myDE.Value;foreach (MySqlParameter q in cmdParms){if (q.Direction == ParameterDirection.InputOutput){q.Value = indentity;}}PrepareCommand(cmd, conn, trans, cmdText, cmdParms);int val = cmd.ExecuteNonQuery();foreach (MySqlParameter q in cmdParms){if (q.Direction == ParameterDirection.Output){indentity = Convert.ToInt32(q.Value);}}cmd.Parameters.Clear();}trans.Commit();}catch{trans.Rollback();throw;}}}}/// <summary>/// 执行一条计算查询结果语句,返回查询结果(object)。/// </summary>/// <param name="SQLString">计算查询结果语句</param>/// <param name="cmdParms">准备好的参数列表</param>/// <returns>查询结果(object)</returns>public  object GetSingle(string SQLString, params MySqlParameter[] cmdParms){using (MySqlConnection connection = new MySqlConnection(connectionString)){using (MySqlCommand cmd = new MySqlCommand()){try{PrepareCommand(cmd, connection, null, SQLString, cmdParms);object obj = cmd.ExecuteScalar();cmd.Parameters.Clear();if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))){return null;}else{return obj;}}catch (MySqlException e){throw e;}}}}*/#endregion}
}

3.6 创建字符串操作类

你们从《C#底层库–字符串操作类》拷贝吧,篇幅有限我就不介绍讲解了。
C#底层库–字符串操作类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129520428

3.7 编写API控制器

WebAPI项目,Controllers文件夹下,创建类QRController.cs,当然如果你也可以不采用这种方式,直接C/S架构,客户端直接调用【核心类】获取自动编号,本章节可以跳过。
这里,我提供了控制器中【自动编号获取的方法】,复制以下代码:
注意:非必要内容,不采用WebAPI调用方式,可以不看本章节。

     /// <summary>/// 自动编号/// </summary>/// <param name="a_objData">传入数据实体</param>/// <returns></returns>[HttpPost]public ActionResult GetAutoCode([FromBody] object a_objData){string l_strErrorCode = "C04";//错误码ActionResult m_Result = new ActionResult();if (a_objData == null && a_objData.ToString().Length == 0){m_Result.Validate = false;m_Result.RetInfo = new CRetInfo() { ErrorCode = l_strErrorCode + "1", IsSUCD = false, ErrorMsg = Const.ct_strIsNullParam };m_Result.Data = new CData() { Obj = null, Table = null, cByte = null, Tostring = "" };return m_Result;}string l_strData = a_objData.ToString();AutoCodeRuleModel l_DataModel = new AutoCodeRuleModel();try{l_DataModel = JsonConvert.DeserializeObject<AutoCodeRuleModel>(l_strData);}catch (Exception ex){m_Result.Validate = false;m_Result.RetInfo = new CRetInfo() { ErrorCode = l_strErrorCode + "2", IsSUCD = false, ErrorMsg = Const.ct_strAnalysisFail + ex.Message };m_Result.Data = new CData() { Obj = null, Table = null, cByte = null, Tostring = "" };return m_Result;}//查询表是否存在MySQLHelper mySQL = new MySQLHelper();try{bool l_bExists = mySQL.Exists(l_DataModel.表);if (!l_bExists){m_Result.Validate = false;m_Result.RetInfo = new CRetInfo() { ErrorCode = l_strErrorCode + "3", IsSUCD = false, ErrorMsg = Const.ct_strTableNotExists};m_Result.Data = new CData() { Obj = null, Table = null, cByte = null, Tostring = "" };return m_Result;}}catch (Exception ex){m_Result.Validate = false;m_Result.RetInfo = new CRetInfo() { ErrorCode = l_strErrorCode + "4", IsSUCD = false, ErrorMsg = Const.ct_strFetchFail + ex.Message };m_Result.Data = new CData() { Obj = null, Table = null, cByte = null, Tostring = "" };return m_Result;}//取编号try{string l_strAutoCode = AutoCodeClient.GetAutoCode(l_DataModel.编号规则, l_DataModel.表, l_DataModel.字段);m_Result.Validate = true;m_Result.RetInfo = new CRetInfo() { ErrorCode = l_strErrorCode + "5", IsSUCD = true, ErrorMsg = Const.ct_strFetchSuccess };m_Result.Data = new CData() { Obj = null, Table = null, cByte = null, Tostring = l_strAutoCode };}catch (Exception ex){m_Result.Validate = false;m_Result.RetInfo = new CRetInfo() { ErrorCode = l_strErrorCode + "6", IsSUCD = false, ErrorMsg = Const.ct_strFetchFail + ex.Message };m_Result.Data = new CData() { Obj = null, Table = null, cByte = null, Tostring = "" };}return m_Result;}

WebAPI返回的数据实体,ActionResult.cs类,在我的《【C#】条码管理》有所提及,我把所有HTTP请求方法都合并到一个项目中了。

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace MobileAPIService
{/// <summary>/// 手持端返回统一接口样式(已定稿,不再变更)/// </summary>/*{"Validate": true,"RetInfo": {"ErrorCode": 0,"IsSUCD": true,"ErrorMsg": ""},"Data": {"Obj": {"UserNo": "admin","UserPwd": "123","AutoPwd": "T"},"Table": null,"Tostring": "验证成功!"}
}       */public class ActionResult{public bool Validate { get; set; }  //验证成功,用于服务器不报错,数据检查public CRetInfo RetInfo { get; set; }  //服务器异常,返回信息public CData Data { get; set; }  //无异常,返回数据到前端}//数据类(正常数据返回)public class CData{public object Obj { get; set; } //接实体类public DataTable Table { get; set; } //接表格,用于查询public byte[] cByte { get; set; } //接字节流,用于文件下载public string Tostring { get; set; } //接字符串//[JsonIgnore]//public string[] ToArrary { get; set; } //保留,字符数组//[JsonIgnore]//public List<string> ToList { get; set; } //保留,list}//返回信息类(服务器异常)public class CRetInfo{public string ErrorCode { get; set; }   //错误码public bool IsSUCD { get; set; }    //是否异常public string ErrorMsg { get; set; }//错误消息}}

四、运行效果

4.1 调用方式

【业务编号】获取方式,已部署API服务,支持多端(pad、PC)获取业务编号。

URL: http://172.16.**.*:8888/API/QR/GetAutoCode
http请求方式:POST
数据类型:json
调用样例:
{
“编号规则”: “[一位年份]A0N[流水编号];6”,
“表”: “t_codenumbertest”,
“字段”: “编号”
}

4.2 参数说明

“编号规则”:自动编号的规则定义
“表”:业务编号最终,保存的数据库表。
“字段”:表字段。如“钨条标签打印纪录表”字段“钨条编号”是单据号,那么 表=“钨条标签打印纪录表”、字段=“钨条编号”
其它问题:
①编号规则可根据需求添加 “规则类型”,目前支持:
[一位年份]
[两位年份]
[四位年份]
[两位月份]
[紧缩天数] --10日以内的天数,占用1位
[两位天数]
[设备前缀]
[流水编号]
②规则中,“固定值”如何设置?
不加中括号 [],均为固定值,编码自动保留。
③规则中,流水号位数如何设置?
流水号默认4位,如果有特殊需要+分号+数字。如:“[流水编号];6”,是系统出6位流水号。
“编号规则”: “[一位年份]A0N[流水编号];6”,

4.3 项目展示

我使用Postman给你看一下效果,真实项目涉及公司机密,不便于展示。
① “编号规则”: “[一位年份]A0N[流水编号];6”,

② “编号规则”: “SO[四位年份][两位月份][流水编号];4”,

③ “编号规则”: “[两位年份][两位月份][流水编号]PZ;10”,

你想怎么定义规则,编号就怎么生成。

五、资源链接

5.1 数据库脚本

这是我的测试表,MySQL数据库版,实际项目调用,更换 表名、字段名就OK了。

CREATE TABLE `t_codenumbertest` (`编号` varchar(40) DEFAULT NULL,`说明` varchar(200) DEFAULT NULL,`id` int NOT NULL AUTO_INCREMENT,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;/*Data for the table `t_codenumbertest` */insert  into `t_codenumbertest`(`编号`,`说明`,`id`) values
('3A0N000001','3A0N000001',1),
('3A0N000002','3A0N000002',2);

【C#】编号生成器(定义单号规则、固定字符、流水号、业务单号)相关推荐

  1. 基于vue3的京东nutui组件库的表单校验规则:怎样进行表单验证?怎样只使用指定的某一个规则进行校验呢?

    官网: NutUI - 移动端 Vue2.Vue3.小程序 组件库京东风格的轻量级移动端 Vue.React 组件库https://nutui.jd.com/#/component/form 用法: ...

  2. 实战分享,百家号怎么赚钱?带你百家号快速转正赚钱!

    这几年,自媒体一路风生水起,越来越多的人听说,了解,知道自媒体.很多人用自媒体百家号兼职赚到钱,甚至有人在互联网自媒体上,赚到了人生的一桶金. 自媒体一直都是红利期,从以前的,个人站长,到个人博客,微 ...

  3. java 电子编号生成器_业务编号生成器

    在我们实际做项目的过程中,时常需要生成一些跟业务相关的一些唯一的业务编号,这些编号又需要一定的规则,一般是每生成一个新的编号是在前一个编号的集成上尾号递增1个单位,下面是我业余时间写的一个编号生成器, ...

  4. js html 单引号,JS 和 HTML 中的单引号与双引号

    JS中的单引号与双引号 HTML中的单引号与双引号很简单,就是两个字符实体: 显示 描述 实体名称 实体编号 " 双引号.引号 " " ' 单引号.撇号 ' ' x 1 ...

  5. bootstrapvalidator已定义的验证规则

    bootstrapvalidator已定义的验证规则 说明 查找bootstrapValidator的选项options 查找bootstrapValidator的已验证规则 常用规则 说明 这里使用 ...

  6. nginx匹配规则_Nginx系列之server_name定义与匹配规则

    Nginx系列之server_name定义与匹配规则 server_name用来指定请求中的Host头部,在上一节的基于域名的虚拟机中,nginx匹配的规则就是根据server_name的不同,结合请 ...

  7. mysql老叶博客_MySQL binlog后面的编号最大是多大?【老叶茶馆公众号】

    MySQL binlog后面的编号最大是多大? 具体文章请关注微信公众号:izhishuedu [知数堂] 知数堂版权所有. 这里我就不啰嗦了,直接上贴代码: 版本:5.7.18 mysql-5.7. ...

  8. js验证电话号码(包括手机,固定电话,带区号,不带区号))

    函数名称:IsTelephone 函数功能:固话,手机号码检查函数,合法返回true,反之,返回false 函数参数:obj,待检查的号码 检查规则: (1)电话号码由数字."(" ...

  9. 正则表达式 申通单号规则

    申通 APP项目  单号规则 其实单号规则很容易写的  开始我也不太了解正则表达式   我只是看了一下安卓代码   然后写了个OC版本的  一次成功 全代码如下 就一个CodeMatches类 #im ...

最新文章

  1. Altium designer中导入CAD文件
  2. python源码编译安装 gb18030_源代码编译安装Python3.5.2
  3. html cursor居中,CSS cursor属性
  4. Linux中特殊字符
  5. 在一个窗口显示多个视频子窗口
  6. 整人小程序c++实现(附源码)
  7. JavaSwing订餐管理系统
  8. 中文数字转阿拉伯数字
  9. 不做生活上的“富察皇后”,Soul星球遇见真实的灵魂
  10. 分类模型效果评估指标
  11. stub,存根是什么?
  12. 写字机器人制作教程 midt-bot
  13. 关于火狐浏览器不能看中国大学mooc上视频的解决办法
  14. 守卫解救acm_让作家阻止了它的解救
  15. web面向接口_面向未来的响应式Web开发
  16. Spring Boot @DeleteMapping(转)
  17. Realm在android的应用
  18. 关于虚拟机中安装Ubuntu时界面显示不全的解决办法
  19. 域名管理——DNS服务
  20. hawk大数据基础知识总结(1)

热门文章

  1. 必须熟练的基础linux命令
  2. 基于stm32的简单小项目_适合小白做的创业3个小项目,简单上手
  3. 【数学问题】最大质因数
  4. 测序比对软件的总结---salmon
  5. html4播放mp3,如何使用ipod shuffle4代?导入和播放mp3文件格式的音乐?
  6. linux中grub详解
  7. 爱上你是一种流泪的幸福[黑、浅紫]
  8. SQL Server 安装教程
  9. 小米手机陷围城:被指顶多再撑一年
  10. 023 导数之左导数、右导数;可导必然连续,连续不一定可导