如何在VB.NET预订系统中实现BYYMMDD格式唯一自动预订ID生成功能
实现思路
- 首先判断当前操作是新增还是编辑:如果
numRECID.Value > 0说明是编辑已有记录,无需修改预订ID,直接返回True即可 - 若为新增记录,先提取当前选择的预订日期
dtBKGDT.Value,按YYMMDD格式生成日期字符串,拼接前缀B得到ID前半段,例如B240520 - 去
INBKG_TBL表查询所有预订日期和当前选择日期一致的记录,提取这些记录的INBKG_BKGID中的最大序号值:- 若当天没有记录,序号默认从
01开始 - 若有记录,最大序号加1后格式化为两位字符串,不足两位前面补0
- 若当天没有记录,序号默认从
- 拼接前缀和序号得到完整的预订ID,赋值给
txtBKGID.Text,返回True - 整个过程加异常捕获,出错时返回False并提示错误
AutoBKGID 函数实现代码
Private Function AutoBKGID() As Boolean Try ' 编辑状态直接返回,不修改原有ID If numRECID.Value > 0 Then Return True End If ' 生成ID前缀:B + YYMMDD Dim dtCur As Date = dtBKGDT.Value Dim strPrefix As String = "B" & dtCur.ToString("yyMMdd") Dim intMaxSeq As Integer = 0 ' 查询当日最大序号 Dim strSQL As String = "SELECT RIGHT(INBKG_BKGID, 2) AS MAXSEQ FROM INBKG_TBL " & _ "WHERE INBKG_BKGDT = '" & gfSQLDate(dtCur) & "' " & _ "ORDER BY INBKG_BKGID DESC" Dim dt As DataTable = ExecProc(strSQL) ' 有记录则取最大序号+1,否则默认01 If dt.Rows.Count > 0 Then Integer.TryParse(dt.Rows(0)("MAXSEQ").ToString(), intMaxSeq) End If intMaxSeq += 1 ' 拼接完整ID赋值给输入框 txtBKGID.Text = strPrefix & "-" & intMaxSeq.ToString("00") Return True Catch ex As Exception MessageBox.Show("自动生成预订ID失败:" & ex.Message, "AutoBKGID", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) Return False End Try End Function
补充说明
- 如果业务单日预订量可能超过99条,可以把序号的位数调整为3位,把代码里的
ToString("00")改成ToString("000"),同时对应调整INBKG_BKGID的字段长度即可 - 原有代码的SQL拼接写法存在SQL注入风险,建议后续优化为参数化查询,提升安全性
- 若存在多用户同时新增的并发场景,建议在插入记录时再加一次ID唯一性校验,避免出现重复ID的问题
内容的提问来源于stack exchange,提问作者StillGotAlotToLearn
相关产品推荐
相关产品推荐

