我正在开发一个内容管理系统,用于管理员可以添加,编辑和删除更新的更新。
在admin添加更新的表单中,我想创建一个文本框,显示名为“Update_ID”的数据库中isIdentity列的下一个值。我不能只从数据库中检索最后一行并添加1,因为如果管理员删除数据库中的最后一条记录,文本框中的值将不会反映下一行的真实“Update_ID”。
如何解决这个问题?有没有办法获取数据库中下一个isIdentity列的实际值?谢谢:))
答案 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();
}