返回最后插入的ID,而不使用第二个查询
本文关键字:第二个 查询 最后 插入 ID 返回 | 更新日期: 2023-09-27 17:52:15
我正在做一个ASP。. NET项目(c#)与SQL Server 2008.
当我插入一行到数据库中的表时,我想获得最后插入的ID,这是表的IDENTITY (Auto incresed)。
我不希望使用另一个查询,并做一些像…
SELECT MAX(ID) FROM USERS;
因为-即使它只是一个查询-它感觉很蹩脚…
当我插入一些东西时,我通常使用ExecuteNonQuery(),它返回受影响行的数量。
int y = Command.ExecuteNonQuery();
是否有一种方法可以返回最后插入的ID而不使用另一个查询?
大多数人都是这样做的:
INSERT dbo.Users(Username)
VALUES('my new name');
SELECT NewID = SCOPE_IDENTITY();
(或者不使用查询,将其赋值给变量)
所以这不是两个查询对表…
但是也有以下方法:
INSERT dbo.Users(Username)
OUTPUT inserted.ID
VALUES('my new name');
您将无法真正地检索ExecuteNonQuery
,但是
您可以将id作为存储过程的输出参数返回,例如@userId int output
然后,插入之后,SET @userId = scope_identity()
- 即使它只是一个查询-它感觉很蹩脚…
这实际上也是错误的,因为你可以有多个重叠的iserts。
这是我一直觉得有趣的一件事——人们不阅读文档。
SELECT SCOPE_IDENTITY()
返回在特定范围内生成的最后一个标识值,并且语法正确。它也有适当的文档。
有没有一种方法来返回最后插入的ID不使用另一个查询?
是的。查询同一个SQL批处理中的数字
INSERT (blablab9a); SELECT SCOPE_IDENTITY ();
作为一个字符串。ExecuteScalar .
一个批处理中可以有多条SQL语句
如果你想从c#代码中执行查询&想要得到最后插入的id,那么你必须找到下面的代码。
SqlConnection connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
connection.Open();
string sql = "Insert into [Order] (customer_id) values (" + Session["Customer_id"] + "); SELECT SCOPE_IDENTITY()";
SqlCommand cmd = new SqlCommand();
cmd.Connection = connection;
cmd.CommandText = sql;
cmd.CommandType = CommandType.Text;
var order_id = cmd.ExecuteScalar();
connection.Close();
Console.Write(order_id);