检索最近插入的记录的ID

时间:2014-04-26 07:24:56

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

我目前在代码隐藏

中有这个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以将其添加到另一个表

3 个答案:

答案 0 :(得分:3)

更改查询文本以添加第二个语句:

 ...;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执行这两个语句,因为我们想要捕获最后一个命令的结果。

答案 1 :(得分:2)

您需要运行新的SqlCommand。使用以下语句设置lastInsertId的值:

SELECT SCOPE_IDENTITY()

答案 2 :(得分:0)

这将是一项额外的知识。

我们有多个选项,例如:

@@IDENTITY
SCOPE_IDENTITY
IDENT_CURRENT

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

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

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

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