在数据库中生成自动ID

时间:2019-04-09 17:31:08

标签: vb.net ms-access

我有一个捕获产品详细信息的表。我希望能够生成包含特殊字符的自动ID

我已经能够编写生成自动ID并添加一个新ID的代码。但是问题出在第10位和第11位记录上。

似乎将第9条记录视为数据库中的MAX。

这将引发重复的错误。 例如,记录9生成CAT009,记录10生成CAT0010,但是要生成记录11作为CAT0011,由于我在SELECT语句中使用了MAX函数,它似乎一直在生成CAT0010。

  Sub auto()
    Try
        Dim cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Application.StartupPath & "\inventory1.accdb")
        cn.Open()
        Dim dr As OleDbDataReader
        Dim cmddr As New OleDbCommand
        cmddr.CommandText = "SELECT MAX(category_id) as max_id FROM tblcategory "
        cmddr.Connection = cn
        dr = cmddr.ExecuteReader
        dr.Read()
        If IsDBNull(dr("max_id")) Then
        autonumber = "CAT00" & 1
        Else
            Dim str As String
            str = dr.Item("max_id").ToString()
            Dim P As Double
            Dim N As Double
            N = Len(str)
            P = N - 5
            autonumber = "CAT00" & Convert.ToInt32(str.Substring(5, P))+ 1               
        End If
        cn.Close()
    Catch Ex As Exception
        MsgBox(Ex.Message)
        Console.WriteLine(Ex.Message)
    End Try
End Sub

1 个答案:

答案 0 :(得分:0)

总体概念是其他问题的重复,关键问题是正确的数字格式以及正确的零填充。 VB.Net中有多种方法可以执行此操作,但是Int32.ToString(String)接受可以处理零填充的格式字符串。不必计算字符串的长度,因为Substring()具有重载功能,可将所有剩余字符移到右侧。

    If IsDBNull(dr("max_id")) Then
      autonumber = "CAT001"
    Else
        Dim str As String
        str = dr.Item("max_id").ToString()
        autonumber = "CAT" & (Convert.ToInt32(str.Substring(3)) + 1).ToString("000");
    End If    

如果前两个零应该是静态的(即始终为“ CAT00”),则仍然必须使用适当的填充来格式化更改部分,这一点至关重要。否则,文本字符串将无法正确排序,因此数字顺序将无效。在这种情况下,您应该使用类似

    If IsDBNull(dr("max_id")) Then
      autonumber = "CAT00001" '* NOT CAT001
    Else
        Dim str As String
        str = dr.Item("max_id").ToString()
        autonumber = "CAT00" & (Convert.ToInt32(str.Substring(5)) + 1).ToString("000");
    End If

当然,无论哪种情况,请注意,整数位数会限制有效数字的范围。例如,三位数(“ 000”)的最大值为999。


更好的方法是在数据库132 -> "CAT132"中使用纯整数自动编号。然后仅格式化数字以用于显示,并在必要时解析用户输入的文本以提取整数部分:"CAT0089" -> 89。这种方法极大地简化了后端代码,并将“自动编号”功能留给了数据库本身……无需使用自定义代码即可生成数字。