INSERT上的返回ID?

我有一个INSERT查询,我希望DB返回刚刚插入的行的ID。

sqlString = "INSERT INTO MagicBoxes (OwnerID, Key, Name, Permissions, Active, LastUpdated) VALUES (@OwnerID, @BoxKey, @BoxName, 0, 1, @Date) SET @ID = SCOPE_IDENTITY();"; cmd = new SqlCommand(sqlString, con); cmd.Parameters.AddWithValue("@OwnerID", OwnerID); cmd.Parameters.AddWithValue("@BoxKey", BoxKey); cmd.Parameters.AddWithValue("@BoxName", BoxName); cmd.Parameters.AddWithValue("@Username", Username); cmd.Parameters.AddWithValue("@Date", DateTime.Now); cmd.ExecuteNonQuery(); 

我目前有这个,我不确定接下来需要做什么……

你只需要将@ID添加到params集合中,然后像这样检索它,

 cmd.Parameters.Add("@ID", SqlDbType.Int, 4).Direction = ParameterDirection.Output; cmd.ExecuteNonQuery(); //Now just read the value of: cmd.Parameters["@ID"].value 

或者,如果您更喜欢这种语法:

 SqlParameter param = new SqlParameter("@ID", SqlDbType.Int, 4); param.Direction = ParameterDirection.Output; cmd.Parameters.Add(param); 

你有两个选择; 你可以声明一个名为@IDOutput参数; 或 – 您可以将结束更改为SELECT SCOPE_IDENTITY()并使用:

 int id = (int)cmd.ExecuteScalar(); 

我更喜欢forms参数方法,但ExecuteScalar效果很好。

自SQL Server 2008以来,在TSQL的语法中添加了一个OUTPUT子句 。 这允许您将受DML查询影响的数据添加到表格数据流中。

虽然在查询后查询SCOPE_IDENTITY()会返回正确的信息,但它会强制SQL Server执行2个查询,其中output子句将此限制为一个查询。

知道这一点,正在执行的查询可以改变如下(假设[Id]是身份的名称):

 INSERT INTO MagicBoxes (OwnerID, [Key], Name, [Permissions], Active, LastUpdated) OUTPUT INSERTED.Id VALUES (@OwnerID, @BoxKey, @BoxName, 0, 1, @Date) 

另一个问题是没有处理SqlCommand 。 ADO.net中的大多数Sql...对象都实现了IDisposable ,应该正确处理掉。

将所有内容整合在一起我将按如下方式实现这段代码:

  using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["db"].ConnectionString)) using (var cmd = new SqlCommand(@" INSERT INTO MagicBoxes (OwnerID, [Key], Name, [Permissions], Active, LastUpdated) OUTPUT INSERTED.Id VALUES (@OwnerID, @BoxKey, @BoxName, 0, 1, @Date) ", conn)) { cmd.Parameters.AddRange(new[] { new SqlParameter("@OwnerID", SqlDbType.Int).Value = OwnerID, new SqlParameter("@BoxKey", SqlDbType.VarChar).Value = BoxKey, new SqlParameter("@BoxName", SqlDbType.VarChar).Value = BoxName, new SqlParameter("@Date", SqlDbType.DateTime).Value = DateTime.Now }); conn.Open(); var id = (int)cmd.ExecuteScalar(); } 

将其添加到您的参数中

 SqlParameter IDParameter = new SqlParameter("@ID",SqlDbType.Int); IDParameter.Direction = ParameterDirection.Output; cmd.Parameters.Add(IDParameter); 

执行后,您可以检索ID

 int id = (int)IDParameter.Value; 

你为什么不打电话给商店程序。 将值传递给存储过程以获取插入的值,并从SP返回使用SCOPE_IDENTITY().插入的最后一个种子值SCOPE_IDENTITY(). 希望这有帮助。