问题描述
我一直在浏览互联网(也在这里),我找到了一个可能对我有用的代码。但是,它不会增加,我不知道还有什么问题。这是代码,请帮我解决这个问题:
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
解决方法
您只是检索单个数据,因此 DataReader
不是必需的。
使用 ExecuteScalar
返回结果集中第一行的第一列。它返回一个 Object
,因此它需要 CInt
。
您需要注意数据类型。 String
和 Integer
是两种不同的类型。一个不能在没有转换的情况下分配给另一个。您不能用 String
进行算术运算。我创建了两个不同的变量。一种用于 Integer
、value
,一种用于 String
、StrValue
。您可以使用 Integer
将 String
连接到 &
。 & 号告诉编译器对 .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
使用自动增量字段来避免这种情况。