我想获得" 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。
答案 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而不是删除一个。