使用C#从SQL获取最后插入的行的ID

时间:2015-03-31 11:02:11

标签: c# sql asp.net

我的应用程序中有这个代码,它运行正常。 因为我听到它的旧方法,所以我没有使用SCOPE_IDENTITY。 任何人都可以检查我是否正在使用正确的方法获取最后插入的记录ID? 这有用吗如果我添加交易?

using (SqlCommand com = new SqlCommand("INSERT INTO App_Users (UserName, Description) OUTPUT INSERTED.UserID " +
    "VALUES (@pUserName, @pDescription); ", con))
{


    com.Parameters.AddWithValue("@pUserName" ,userNameTxt.Text ); 

    com.Parameters.AddWithValue("@pDescription" , userDescription.Text); 



    int lastID = Convert.ToInt32(com.ExecuteScalar());

    foreach (ListViewItem lit in ListView3.Items)
    {
        HiddenField gid = (HiddenField)lit.FindControl("ListGroupID");
        int gidVal = 0;
        if (gid != null && gid.Value != null && !Int32.TryParse(gid.Value, out gidVal)) gidVal = 0;
        if (gidVal != 0)
        {
            com.CommandText = "INSERT INTO App_UserGroups (UserID, GroupID) " +
                "VALUES ( " +   lastID  + ", " + gidVal + ")";
            com.ExecuteNonQuery();
        }
    }

2 个答案:

答案 0 :(得分:0)

你可以使用scope_identity:

using (SqlCommand com = new SqlCommand("INSERT INTO App_Users (UserName, Description) " + " VALUES (@pUserName, @pDescription);" + "SELECT CAST(scope_identity() AS int)" , con))

答案 1 :(得分:0)

我几天前也遇到了同样的问题,我发现this SO post解释了从表中检索插入的id的各种方法。

要回答您的问题,即使您添加了一个事务,也可以在此方案中使用OUTPUT_CLAUSEIDENT_CURRENT,但我会建议IDENT_CURRENT,因为 OUTPUT子句将返回即使语句遇到错误并回滚,也会向客户端发送行。

使用@horHay在评论中建议:

using (SqlCommand com = new SqlCommand("INSERT INTO App_Users (UserName, Description)"+ "VALUES (@pUserName, @pDescription) SELECT IDENT_CURRENT('App_Users'); ", con))


我会不建议 SCOPE_IDENTITY@@IDENTITY,因为如果您不使用可能会返回错误值(null) SQL Server 2008 R2 SP2 或更高版本(source - 页面的最后一行。)特别针对您的要求(在其他表中插入值)。