我正在编写一些代码,用于使用存储过程(sp_AddNewUser)将用户数据插入数据库。存储过程只是将数据插入到数据库中。我想知道是否可以在没有编辑存储过程的情况下将SCOPE_IDENTITY()函数与存储过程一起使用。
SqlCommand cmd = new SqlCommand("sp_AddNewUser", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@firstname", SqlDbType.VarChar).Value = row.Cells[_dicDef["firstname"]].Value;
cmd.Parameters.Add("@lastname", SqlDbType.VarChar).Value = row.Cells[_dicDef["lastname"]].Value;
cmd.ExecuteNonQuery();
//NOT SURE WHAT TO DO AFTER THIS COMMENT ----
string sql = "SELECT CAST(scope_identity() AS int)";
cmd = new SqlCommand(sql, conn);
newID = (Int 32_cmd.ExecuteScalar(); //<---- will this return the latest id?
}
答案 0 :(得分:0)
不,你不能这样使用它。正如MSDN所述:
返回插入同一范围中的标识列的最后一个标识值。范围是一个模块:存储过程,触发器,函数或批处理。因此,如果两个语句在同一存储过程,函数或批处理中,则它们在同一范围内。
它不适用于您,因为您的两个语句不在同一范围内且SCOPE_IDENTITY()
不返回任何内容。
在这种情况下使用@@IDENTITY
将返回您需要的值:
@@ IDENTITY将返回在当前会话的任何范围内插入的最后一个标识列值
你必须小心,但要确保它是正确的身份(在上面的例子中应该没问题。)