我目前在代码隐藏
中有这个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以将其添加到另一个表
答案 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返回为当前会话中的任何表和当前范围生成的最后一个标识值。