我已经能够编写生成自动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
答案 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
。这种方法极大地简化了后端代码,并将“自动编号”功能留给了数据库本身……无需使用自定义代码即可生成数字。