8

我正在使用 SQL Server 2008 开发 ASP.NET 项目 (C#)。

当我在数据库中的表中插入一行时,我想获取最后插入的 ID,即表的IDENTITY(自动递增)。

我不想使用另一个查询,并做类似...

SELECT MAX(ID) FROM USERS;

因为 - 即使它只是一个查询 - 感觉很蹩脚......

当我插入一些东西时,我通常使用ExecuteNonQuery(),它返回受影响的行数。

int y = Command.ExecuteNonQuery();

有没有办法在不使用另一个查询的情况下返回最后插入的 ID ?

4

4 回答 4

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

于 2013-01-12T23:39:33.757 回答
5

您可以将 id 作为存储过程的输出参数返回,例如@userId int output

然后,在插入之后,SET @userId = scope_identity()

于 2013-01-12T23:39:09.140 回答
3
  • 即使它只是一个查询 - 感觉很蹩脚......

这实际上也是错误的,因为您可以有多个重叠的 iserts。

这是我一直觉得很有趣的一件事——人们不阅读文档。

SELECT SCOPE_IDENTITY()

返回在特定范围内生成的最后一个标识值,并且在语法上是正确的。它也有适当的记录。

有没有办法在不使用另一个查询的情况下返回最后插入的 ID?

是的。询问 saame SQL 批处理中的编号。

INSERT (blablab9a); SELECT SCOPE_IDENTITY ();

作为一个字符串。执行标量。

一个批次中可以有多个 SQL 语句。

于 2013-01-12T23:40:03.193 回答
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);
于 2016-01-11T01:10:58.053 回答