SQL - 获取标识列的下一个值

时间:2012-03-21 13:11:15

标签: c# asp.net sql

我正在开发一个内容管理系统,用于管理员可以添加,编辑和删除更新的更新。

在admin添加更新的表单中,我想创建一个文本框,显示名为“Update_ID”的数据库中isIdentity列的下一个值。我不能只从数据库中检索最后一行并添加1,因为如果管理员删除数据库中的最后一条记录,文本框中的值将不会反映下一行的真实“Update_ID”。

如何解决这个问题?有没有办法获取数据库中下一个isIdentity列的实际值?谢谢:))

2 个答案:

答案 0 :(得分:3)

如果您对这样的事情感兴趣,唯一有效的方法是实际插入空白行并将该行返回给用户进行编辑,因为您无法知道下一个ID的内容没有锁定表的插入,这可能不是你想要做的。

更有效的解决方案可能是在用户最初输入数据时不填写Update_ID字段,然后通过选择SCOPE_IDENTITY或从insert语句返回值来通知他们刚刚创建的ID。

修改 您想要做的一种可能的替代方法(如果您选择升级到SQL Server 2012)是使用新的Sequences功能。不过,我以前从未使用它。

答案 1 :(得分:1)

您可以在会话或表范围上获取最后插入的标识值,这里有一些阅读:

但是你必须记住,每次插入表都会改变这些值,所以你不能相信它们。最好的方法是不要在前面显示这个值。在相关资源的情况下,您可以创建一个存储过程(或只是一个内联T-SQL块),它将插入主表,检索SCOPE_IDENTITY,然后插入具有检索值的子表。

修改

上面我刚才描述的一个例子(使用ADO.NET):

using (SqlConnection connection = new SqlConnection(_connectionString))
{
    connection.Open();

    SqlTransaction transaction = connection.BeginTransaction();

    int insertedIdentity;
    using (SqlCommand command = new SqlCommand("INSERT INTO TableNames(ColumnsList) VALUES(@ValuesList) SELECT @InsertedIdentity = SCOPE_IDENTITY()", connection, transaction))
    {
        command.CommandType = CommandType.Text;
        //Add any parameters required by INSERT here, then add parameter for SCOPE_IDENTITY
        ...
        command.Parameters.Add(new SqlParameter("@InsertedIdentity", SqlDbType.Decimal) { Direction = ParameterDirection.Output });
        command.ExecuteNonQuery();
        insertedIdentity = Convert.ToInt32(command.Parameters["@InsertedIdentity"].Value);
    }

    //Now you can make all the child inserts using insertedIdentity and transaction
    ...

    transaction.Commit();
}