我工作的一个ASP.NET项目(C#)与SQL Server 2008。
当我插入一行到数据库中的表,我想获得最后插入的ID,这是表的IDENTITY(自动递增)。
我不希望使用另一个查询,并且这样做...
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。
这是一件事,我一直fuind有趣 - 人们不读书的文档。
SELECT SCOPE_IDENTITY()
返回在特定的范围内所生成的最后一个标识值和语法正确。 它还被正确记录。
是不是有没有办法不使用另一个查询返回最后插入的ID?
是。 请在SAAME 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);