【问题标题】:Generating Auto ID in Database在数据库中生成自动 ID
【发布时间】:2019-04-10 09:00:18
【问题描述】:

我有一个表格,其中包含产品的详细信息。我希望能够生成包含特殊字符的自动 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

【问题讨论】:

  • category_id 是一个字符串? Max 在数字上的工作更符合逻辑。
  • 代码生成 string 值,这些值将作为 strings 而不是根据数值进行比较。 CAT009 总是排序/最后与CAT0010CAT0011CAT00123423432 比较,因为它逐个字符进行比较。 (您称这些为“自动编号”,但它们肯定不是自动编号,因为您必须手动分配它们。Access 已经具有自动编号列功能。如果需要,真正的自动编号可以格式化使用“CAT001”等前缀字符进行演示,同时让数据库适当地管理实际数字。)
  • 那是因为 CAT0010 应该是 CAT010。这也将您的唯一条目限制为仅 999 个条目。如果您只存储一个自动递增数字并在屏幕上正确格式化该数字,会更容易。
  • @LarsTech,category_id 是一个字符串。
  • @C Perkins,如果我在access中格式化,引用数据库只会识别数字而不识别格式化字符CAT00。我希望能够通过使用字段 category_id 的代码引用数据库中的特定记录

标签: vb.net ms-access


【解决方案1】:

整体概念与其他问题重复,关键问题是正确的数字格式和正确的零填充。在 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

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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 2020-09-23
    • 2021-06-29
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 2021-07-22
    相关资源
    最近更新 更多