【问题标题】:Retrieve the Id of recently inserted record检索最近插入记录的 ID
【发布时间】:2014-04-26 07:24:56
【问题描述】:

我目前在代码后面有这个 SQL 插入代码

Dim con As New SqlConnection
Dim conString As String
conString = ConfigurationManager.ConnectionStrings("MyConnection").ConnectionString
con = New SqlConnection(conString)

con.Open()

Dim cmd As New SqlCommand("INSERT INTO AdditionalDaysRequest(Status, AdditionalDays, Justification,RequestDaySubmitted) VALUES (@Status,@AdditionalDays,@Justification,@RequestDaySubmitted)", con)

cmd.Parameters.AddWithValue("@Status", "Pending Request")
cmd.Parameters.AddWithValue("@AdditionalDays", TB_Days.Text)
cmd.Parameters.AddWithValue("@Justification", TB_Justification.Text)
cmd.Parameters.AddWithValue("@RequestDaySubmitted", Date.Now)

cmd.ExecuteNonQuery()
con.Close()

此表中的Id是自动生成并递增的

我现在想要的是插入这条记录的 ID 以将其添加到另一个表中

【问题讨论】:

  • 嗨 SeRo,AdditionalDaysRequest 表的主键是什么?
  • 嗨,PK 是我要获取的 ID,它也是自动递增的

标签: asp.net sql-server vb.net insert identity


【解决方案1】:

更改您的查询文本以添加第二条语句:

 ...;SELECT SCOPE_IDENTITY();

SELECT SCOPE_IDENTITY() 语句返回插入到与上述 MSDN 文章相同范围内的标识列中的最后一个标识值。
此外,如果使用分号分隔语句,则可以使用 Sql 引擎理解和处理作为单个字符串传递的两个或多个命令语句的能力。
通过这种方式,您对执行单程到数据库有很大的好处。

 Dim cmd As New SqlCommand("INSERT INTO AdditionalDaysRequest(Status, " & _ 
     "AdditionalDays, Justification,RequestDaySubmitted) VALUES " & _
     "(@Status,@AdditionalDays,@Justification,@RequestDaySubmitted);" & _ 
     "SELECT SCOPE_IDENTITY()", con)

 cmd.Parameters.AddWithValue("@Status", "Pending Request")
 cmd.Parameters.AddWithValue("@AdditionalDays", TB_Days.Text)
 cmd.Parameters.AddWithValue("@Justification", TB_Justification.Text)
 cmd.Parameters.AddWithValue("@RequestDaySubmitted", Date.Now)
 Dim result = cmd.ExecuteScalar()
 con.Close()     
 if result IsNot Nothing Then

       Dim lastInsertId = Convert.ToInt32(result)

 End If

请注意,这两条语句现在使用ExecuteScalar 而不是ExecuteNonQuery 执行,因为我们要捕获最后一条命令的结果。

【讨论】:

  • 完美答案的伙伴。赞赏!
【解决方案2】:

您将需要运行一个新的 SqlCommand。用这个语句设置 lastInsertId 的值:

SELECT SCOPE_IDENTITY()

【讨论】:

    【解决方案3】:

    这将是一个额外的知识。

    我们有多种选择,例如:

    @@IDENTITY
    SCOPE_IDENTITY
    IDENT_CURRENT
    

    所有三个函数都返回最后生成的标识值。不过

    IDENT_CURRENT 返回为任何会话和任何范围内的特定表生成的最后一个标识值。

    @@IDENTITY 返回为当前会话中的任何表在所有范围内生成的最后一个标识值。

    SCOPE_IDENTITY 返回为当前会话和当前范围内的任何表生成的最后一个标识值。

    【讨论】:

      猜你喜欢
      • 2019-11-17
      • 1970-01-01
      • 2015-02-07
      • 1970-01-01
      • 2012-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多