【问题标题】:How do I generate a new Primary Key ID through code?如何通过代码生成新的主键 ID?
【发布时间】:2015-01-13 13:32:30
【问题描述】:

所以基本上我正在尝试将以下代码写入数据库,并且我将主键作为 Int 并且它是 autogen 但是当写入数据库时​​它不允许我这样做它一直告诉我我不是t 允许输入空值(因为代码显然没有写入主键字段)所以我使用了该行

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()

【问题讨论】:

  • 删除所有对insert语句/参数中字段的引用,数据库会为您处理。
  • 创建唯一的主键是数据库的工作if/when EventID 在数据库中是这样定义的。对于 MySQL,我认为是AUTO_INCREMENT
  • 您标记了 MySql,但您在示例中使用了 SQL Server?

标签: mysql sql asp.net database vb.net


【解决方案1】:

如果您的 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 中的保留字,因此只有将其括在方括号中才能将其用作列的名称

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 2012-10-03
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多