首页 > 解决方案 > 自动生成 ID 号 VB.Net 不工作 [Access DB]

问题描述

我一直在寻找互联网(以及这里),我发现了一个可能对我有用的代码。但是,它不会增加,我不知道还有什么问题。这是代码,请帮助我解决这个问题:


Private Function GenID() As String
        Dim dr As OleDbDataReader
        Dim com As OleDbCommand
        Dim value As String = "2021000"

        Try
            con.Open()
            com = New OleDbCommand("SELECT MAX(studno) FROM record", con)
            dr = com.ExecuteReader()
            If dr.HasRows Then
                dr.Read()
                value = dr.Item("studno")
            End If

            value += 1

            If value <= 9 Then                'Value is between 0 and 10
                value = "202100" & value
            ElseIf value <= 99 Then        'Value is between 9 and 100
                value = "20210" & value
            ElseIf value <= 999 Then        'Value is between 999 and 1000
                value = "2021" & value
            End If

        Catch ex As Exception
            MsgBox(ex.Message)

        End Try

        Return value
    End Function

    Private Sub addRecords_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        studno.Text = GenID()
    End Sub

标签: vb.netms-access

解决方案


您只检索一条数据,因此DataReader没有必要。使用ExecuteScalarwhich 返回结果集中第一行的第一列。它返回一个Object,所以它需要CInt.

您需要小心数据类型。Strings 和Integers 是两种不同的类型。没有转换就不能将一个分配给另一个。你不能用Strings 做算术。我创建了两个不同的变量。一个用于Integer,value一个用于String, StrValue。您可以将IntegeraString与 a 连接起来&.ToString& 号告诉编译器调用Integer变量value.

我已经演示了使用Using...End Using它来确保您的数据库对象被关闭和处置。第一行末尾的逗号Using表示下一行包含在Using. 在这种情况下,命令。

如果您所做的只是在 中显示一个消息框Catch,那么请在用户界面代码中执行此操作。如果Function创建异常,您将不想显示结果。因此,该Return语句退出Sub. 只有在我们成功完成 之后Try...End Try,我们才将 分配NewID给文本框。

Private ConStr As String = "Your connection string"
Private Function GenID() As String
    Dim value As Integer
    Using con As New OleDbConnection(ConStr),
            com = New OleDbCommand("SELECT MAX(studno) FROM record", con)
        con.Open()
        value = CInt(com.ExecuteScalar)
    End Using
    value += 1
    Dim StrValue As String
    If value <= 9 Then                'Value is between 0 and 10
        StrValue = "202100" & value
    ElseIf value <= 99 Then        'Value is between 9 and 100
        StrValue = "20210" & value
    ElseIf value <= 999 Then        'Value is between 999 and 1000
        StrValue = "2021" & value
    Else
        StrValue = "0"
    End If
    Return StrValue
End Function

Private Sub addRecords_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim NewID As String = ""
    Try
        NewID = GenID()
    Catch ex As Exception
        MessageBox.Show(ex.Message)
        Return
    End Try
    studno.Text = NewID
End Sub

此方法在多用户环境中效果不佳。如果 2 个用户同时尝试获取下一个 id,则会产生重复的 id。可以通过在数据库中添加年份列并为studno.


推荐阅读