如何通过代码生成新的Primary Key ID?
How do I generate a new Primary Key ID through code?
所以基本上我正在尝试将下面的代码写入数据库并且我将主键作为 Int 并且它是 autogen 但是当写入数据库时它不允许我这样做它一直告诉我我不允许输入空值(因为代码显然没有写入主键字段)所以我使用了行
cmd.Parameters.Add("@EventID", SqlDbType.Int).Value = 3
但问题是每次我想测试新记录时都必须更改值,即 1、2、3、4 等等。我想知道是否有一行代码我可以通过每次添加 +1 来创建一个值,这样我就不需要每次都进入代码并输入一个新数字。下面是写入数据库的完整代码,因此您可以更好地查看它
Dim Con As SqlConnection
Dim cmd As SqlCommand
Dim recordsAffected As String
Dim cmdstring As String = "INSERT [Event Table](EventID, EventTypeID, EventName, VenueName, NumberOfGuests, Date, ClientAddress, WeddingName, BuildingAddress) Values(@EventID, @EventTypeID, @EventName, @VenueName, @NumberOfGuests, @Date, @ClientAddress, @WeddingName, @BuildingAddress)"
Con = New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\YellowDoor.mdf;Integrated Security=True;User Instance=True")
cmd = New SqlCommand(cmdstring, Con)
cmd.Parameters.Add("@EventID", SqlDbType.Int).Value = 3
cmd.Parameters.Add("@EventTypeID", SqlDbType.Text).Value = EventTypeDD.SelectedValue
cmd.Parameters.Add("@EventName", SqlDbType.Text).Value = EventNametxt.Text
cmd.Parameters.Add("@VenueName", SqlDbType.Text).Value = VenueLoDD.SelectedValue
cmd.Parameters.Add("@NumberOfGuests", SqlDbType.Int).Value = CInt(NumOfGtxt.Text)
cmd.Parameters.Add("@Date", SqlDbType.Int).Value = CInt(DateTxt.Text)
cmd.Parameters.Add("@ClientAddress", SqlDbType.Text).Value = txtAddress.Text
cmd.Parameters.Add("@WeddingName", SqlDbType.Text).Value = txtWedding.Text
cmd.Parameters.Add("@BuildingAddress", SqlDbType.Text).Value = txtBAddress.Text
Con.Open()
recordsAffected = cmd.ExecuteNonQuery
Con.Close()
如果您的 EventID
是 IDENTITY 列,则切勿尝试为其设置值。
只需将该字段作为参数或在 INSERT 命令中忽略即可。
你可以通过这种方式检索数据库引擎分配给你的字段的值
Dim Con As SqlConnection
Dim cmd As SqlCommand
Dim cmdstring As String = "INSERT [Event Table] " & _
"(EventTypeID, EventName, VenueName, NumberOfGuests, [Date], ClientAddress, " & _
"WeddingName, BuildingAddress) Values(@EventTypeID, @EventName, @VenueName, " & _
"@NumberOfGuests, @Date, @ClientAddress, @WeddingName, @BuildingAddress); " & _
"SELECT SCOPE_IDENTITY()"
Using Con = New SqlConnection(".....")
Using cmd = New SqlCommand(cmdstring, Con)
cmd.Parameters.Add("@EventTypeID", SqlDbType.Text).Value = EventTypeDD.SelectedValue
.....
Con.Open()
Dim result = cmd.ExecuteScalar()
if result IsNot Nothing Then
Dim newEventID = Convert.ToInt32(result)
....
End If
End Using
End Using
使用此代码,您不会为 EventID 字段传递任何内容,但会向您的查询添加第二个命令文本。第二个命令将 return 数据库为您的连接为 IDENTITY 列生成的最后一个值。这个双命令(A.K.A。批处理命令)是使用 ExecuteScalar 执行的,因为我们对由 SELECT SCOPE_IDENTIY()
编辑的单个值 return 感兴趣
另请注意 DATE 是 T-SQL 中的保留字,因此只有将其括在方括号中才能将其用作列名
所以基本上我正在尝试将下面的代码写入数据库并且我将主键作为 Int 并且它是 autogen 但是当写入数据库时它不允许我这样做它一直告诉我我不允许输入空值(因为代码显然没有写入主键字段)所以我使用了行
cmd.Parameters.Add("@EventID", SqlDbType.Int).Value = 3
但问题是每次我想测试新记录时都必须更改值,即 1、2、3、4 等等。我想知道是否有一行代码我可以通过每次添加 +1 来创建一个值,这样我就不需要每次都进入代码并输入一个新数字。下面是写入数据库的完整代码,因此您可以更好地查看它
Dim Con As SqlConnection
Dim cmd As SqlCommand
Dim recordsAffected As String
Dim cmdstring As String = "INSERT [Event Table](EventID, EventTypeID, EventName, VenueName, NumberOfGuests, Date, ClientAddress, WeddingName, BuildingAddress) Values(@EventID, @EventTypeID, @EventName, @VenueName, @NumberOfGuests, @Date, @ClientAddress, @WeddingName, @BuildingAddress)"
Con = New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\YellowDoor.mdf;Integrated Security=True;User Instance=True")
cmd = New SqlCommand(cmdstring, Con)
cmd.Parameters.Add("@EventID", SqlDbType.Int).Value = 3
cmd.Parameters.Add("@EventTypeID", SqlDbType.Text).Value = EventTypeDD.SelectedValue
cmd.Parameters.Add("@EventName", SqlDbType.Text).Value = EventNametxt.Text
cmd.Parameters.Add("@VenueName", SqlDbType.Text).Value = VenueLoDD.SelectedValue
cmd.Parameters.Add("@NumberOfGuests", SqlDbType.Int).Value = CInt(NumOfGtxt.Text)
cmd.Parameters.Add("@Date", SqlDbType.Int).Value = CInt(DateTxt.Text)
cmd.Parameters.Add("@ClientAddress", SqlDbType.Text).Value = txtAddress.Text
cmd.Parameters.Add("@WeddingName", SqlDbType.Text).Value = txtWedding.Text
cmd.Parameters.Add("@BuildingAddress", SqlDbType.Text).Value = txtBAddress.Text
Con.Open()
recordsAffected = cmd.ExecuteNonQuery
Con.Close()
如果您的 EventID
是 IDENTITY 列,则切勿尝试为其设置值。
只需将该字段作为参数或在 INSERT 命令中忽略即可。
你可以通过这种方式检索数据库引擎分配给你的字段的值
Dim Con As SqlConnection
Dim cmd As SqlCommand
Dim cmdstring As String = "INSERT [Event Table] " & _
"(EventTypeID, EventName, VenueName, NumberOfGuests, [Date], ClientAddress, " & _
"WeddingName, BuildingAddress) Values(@EventTypeID, @EventName, @VenueName, " & _
"@NumberOfGuests, @Date, @ClientAddress, @WeddingName, @BuildingAddress); " & _
"SELECT SCOPE_IDENTITY()"
Using Con = New SqlConnection(".....")
Using cmd = New SqlCommand(cmdstring, Con)
cmd.Parameters.Add("@EventTypeID", SqlDbType.Text).Value = EventTypeDD.SelectedValue
.....
Con.Open()
Dim result = cmd.ExecuteScalar()
if result IsNot Nothing Then
Dim newEventID = Convert.ToInt32(result)
....
End If
End Using
End Using
使用此代码,您不会为 EventID 字段传递任何内容,但会向您的查询添加第二个命令文本。第二个命令将 return 数据库为您的连接为 IDENTITY 列生成的最后一个值。这个双命令(A.K.A。批处理命令)是使用 ExecuteScalar 执行的,因为我们对由 SELECT SCOPE_IDENTIY()
编辑的单个值 return 感兴趣另请注意 DATE 是 T-SQL 中的保留字,因此只有将其括在方括号中才能将其用作列名