繁体   English   中英

如何通过代码生成新的主键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字段传递任何内容,但会向查询中添加第二个命令文本。 第二个命令将返回数据库为您的连接为IDENTITY列生成的最后一个值。 使用ExecuteScalar执行此双重命令(又称为批处理命令),因为我们对SELECT SCOPE_IDENTIY()返回的单个值感兴趣

还要注意,DATE在T-SQL中是保留字,因此只有将其括在方括号中时,才可以将其用作列名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM