返回最后插入的ID而不使用第二个查询

时间:2013-01-12 23:34:51

标签: c# asp.net sql-server-2008

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

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

我不想使用其他查询,并执行类似......

的操作
SELECT MAX(ID) FROM USERS;

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

当我插入内容时,我通常会使用 ExecuteNonQuery(),它会返回受影响的行数。

int y = Command.ExecuteNonQuery();

是否有办法在不使用其他查询的情况下返回最后插入的ID

4 个答案:

答案 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);