删除最后一条记录后,从数据库表中获取MAX id号

时间:2015-09-08 09:31:29

标签: c# asp.net sql-server

我想获得" products"的新行ID,为此我使用MAX SQL命令如下(命令是插入新记录按钮点击事件):

SqlCommand cmd = new SqlCommand("Select ISNULL(MAX(id)+1,0) from products", SqlCon);

问题是当存在ID为10,11,12(12为MAX)且i删除id为12的行时,当新id行为13时,我得到MAX + 1 id 12(" id&# 34;字段是PK,具有标识增量1)。 我可以用其他方式吗?

示例:

id  prodect
--  -------
1     dog
2     cat
3     mouse
4     elefant

当我删除第4行时,我得到MAX(id)+1 = 4,我想得到5,因为这是下一行id。

4 个答案:

答案 0 :(得分:1)

我会抓住我认为你追求的东西。 :)

如果包含SELECT SCOPE_IDENTITY();在您的SQL中,您将获得所需的ID:

INSERT INTO products (
   * your fields *
)
VALUES (
   * your values *
);
SELECT SCOPE_IDENTITY();

然后在您的代码中,您可以拥有:

var Id = Convert.ToInt32(cmd.ExecuteScalar());

这将为您提供已插入记录的ID。

答案 1 :(得分:0)

一种可能的解决方案可能是您不删除行。您可以添加标志并使其处于非活动状态/已删除状态。这样,您的行号将始终保留,您的代码将为您提供最大ID。

答案 2 :(得分:0)

我认为OP试图解决错误的问题......

当您将新产品插入到products表中时,您应该尝试使用scope_identity函数直接检索新ID(SQLServer!):

string sql = "insert into products(name) values('Yellow Cup'); SELECT SCOPE_IDENTITY();";
var sqlCommand = new SqlCommand(sql, conn);
var id = cSqlServer.ExecuteScalar();

答案 3 :(得分:0)

绝对MAX在这种情况下不是任何人都会使用的。最近的解决方案是获取最近使用的身份值,然后将其递增1(在您的情况下)或种子值,无论它是什么。

select ident_current('products') + 1

注意 - 虽然这现在解决了您的目的,但请注意'ident_current'将返回其他会话设置的标识值。简单来说,如果有一些请求/触发/执行导致id甚至在您的按钮单击完成之前递增,那么您将获得inserted_id而不是删除一个。