我正在使用SQL Server 2008开发一个ASP.NET项目(C#)。
当我在数据库中的表中插入一行时,我想获取最后插入的ID,即表的 IDENTITY (自动增量)。
我不想使用其他查询,并执行类似......
的操作SELECT MAX(ID) FROM USERS;
因为 - 即使它只是一个查询 - 感觉很蹩脚......
当我插入内容时,我通常会使用 ExecuteNonQuery(),它会返回受影响的行数。
int y = Command.ExecuteNonQuery();
是否有办法在不使用其他查询的情况下返回最后插入的ID ?
答案 0 :(得分:18)
大多数人通过以下方式执行此操作:
INSERT dbo.Users(Username)
VALUES('my new name');
SELECT NewID = SCOPE_IDENTITY();
(或者代替查询,将其分配给变量。)
所以它不是针对表的两个查询 ...
然而,还有以下方式:
INSERT dbo.Users(Username)
OUTPUT inserted.ID
VALUES('my new name');
尽管如此,您仍然无法使用ExecuteNonQuery
检索此内容。
答案 1 :(得分:5)
您可以将id作为输出参数从存储过程返回,例如@userId int output
然后,在插入后,SET @userId = scope_identity()
答案 2 :(得分:3)
- 即使它只是一个查询 - 感觉很蹩脚......
实际上也是错误的,因为你可以有多个重叠的iserts。
这是我总是很有趣的一件事 - 人们没有阅读文档。
SELECT SCOPE_IDENTITY()
返回在特定范围内生成的最后一个标识值,并且在语法上是正确的。它也有适当的记录。
是否有办法在不使用其他查询的情况下返回最后插入的ID?
是。请求saame SQL批处理中的数字。
INSERT (blablab9a); SELECT SCOPE_IDENTITY ();
作为一个字符串。的ExecuteScalar。
您可以在一个批处理中拥有多个SQL语句。
答案 3 :(得分:2)
如果您想从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);