VB.Net对接Access数据库自动生成ID编号无法自增问题求助
问题根因
你这段代码无法自增的核心问题有3个:
- 字符串和数值逻辑混淆:
value被定义为字符串类型,你直接对带2021前缀的字符串做+=1运算后,后面的判断分支又重新拼接了一次2021前缀,相当于生成的ID会重复叠加前缀,比如第一次生成2021001,第二次就会变成20212021001,数值逻辑完全错乱,自然无法正常自增。 - 空表兼容缺失:当
record表没有数据时,SELECT MAX(studno)返回的是DBNull而非无数据,dr.HasRows判断为真但取到的值为空,赋值给字符串类型的value会触发异常,被catch捕获后就会一直返回初始值2021000。 - 数据库资源未释放:连接、DataReader、Command对象用完后没有关闭释放,会导致后续数据库操作异常,也可能影响ID生成逻辑。
修正后的代码
Private Function GenID() As String Dim maxSeq As Integer = 0 ' 用Using自动释放资源,不用手动关闭 Using con As New OleDbConnection("你的连接字符串") ' 这里替换成你自己的数据库连接配置 con.Open() Using com As New OleDbCommand("SELECT MAX(studno) FROM record", con) Dim result = com.ExecuteScalar() ' 处理空表的DBNull情况 If result IsNot DBNull.Value Then Dim maxStudNo As String = result.ToString() ' 提取前缀2021后面的序号部分,转成整数 If Integer.TryParse(maxStudNo.Substring(4), maxSeq) = False Then maxSeq = 0 End If End If End Using End Using ' 序号自增 maxSeq += 1 ' 拼接前缀+补3位零,不用写多分支if判断 Return $"2021{maxSeq.ToString("000")}" End Function Private Sub addRecords_Load(sender As Object, e As EventArgs) Handles MyBase.Load studno.Text = GenID() End Sub
补充说明
如果后续年份要改成2022、2023,只要把返回值里的固定前缀2021改成动态变量即可,不用改其他逻辑。另外如果学号长度要调整,只要修改ToString("000")里的0的个数就行,比如要4位序号就改成0000。
内容的提问来源于stack exchange,提问作者Gaaaaaab
相关产品推荐
相关产品推荐

