![](/img/trans.png)
[英]how to get the last record number after inserting record to database in access
[英]Get MAX id number from database table after deleting last record
我想为“产品”获取一个新的行 id,为此我使用 MAX SQL 命令作为以下(命令在插入新记录按钮单击事件中):
SqlCommand cmd = new SqlCommand("Select ISNULL(MAX(id)+1,0) from products", SqlCon);
问题是当有 ID 为 10,11,12(12 是 MAX)的行并且我删除 id 12 记录时,当新的 id 行是 13(“id”字段是身份增量的 PK 时,我得到 MAX+1 id 12 1)。 我可以用其他方式做吗?
例子:
id prodect
-- -------
1 dog
2 cat
3 mouse
4 elefant
当我删除第 4 行时,我得到 MAX(id)+1 = 4,我想得到 5,因为这是下一行 id。
我会尝试一下我认为你在追求什么。 :)
如果包括 SELECT SCOPE_IDENTITY(); 在您的 SQL 中,您将获得所需的 ID:
INSERT INTO products (
* your fields *
)
VALUES (
* your values *
);
SELECT SCOPE_IDENTITY();
然后在您的代码中,您可以拥有:
var Id = Convert.ToInt32(cmd.ExecuteScalar());
这将为您提供插入的记录的 ID。
我怀疑实际的问题是How can I find the ID of the row I just inserted so I can use it as a foreign key in related tables or in an image file name?
SQL Server 自 2005 年起在 INSERT、UPDATE、DELETE 语句中提供了OUTPUT 子句,这些语句返回刚刚插入或修改的列的值。 在插入语句的情况下,语法是:
insert into Products (Product)
OUTPUT inserted.ID
VALUES ('xxx')
这是比IDENT_CURRENT
或SCOPE_IDENTITY
值更好的选择,因为它使用单个语句返回值,并且返回的内容没有歧义:
IDENT_CURRENT
可能返回不同的值SCOPE_IDENTITY
返回事务中生成的最后一个 ID,无论表如何您可以返回多个列:
insert into Products (Product)
OUTPUT inserted.ID, inserted.Product
VALUES ('xxx')
您可以使用 ExecuteScalar 执行此语句,如果您只返回一列或 ExecuteReader,如果您想返回更多列。
在 UPDATE 或 DELETE 语句的情况下, deleted
表包含已删除的值, inserted
表包含新值
注意像实体框架这样的 ORM 已经使用这样的语句来检索自动生成的 ID 并更新保存的对象。 在这种情况下,只需读取保存对象的 ID 属性。
一种可能的解决方案可能是您不删除行。 您可以添加一个标志并将其设为非活动/删除。 这样您的行号将始终保留,您的代码将为您提供最大 Id。
我认为 OP 试图解决错误的问题......
当您将新产品插入产品表时,您应该尝试直接使用 scope_identity 函数(SQLServer!)检索新 ID:
string sql = "insert into products(name) values('Yellow Cup'); SELECT SCOPE_IDENTITY();";
var sqlCommand = new SqlCommand(sql, conn);
var id = cSqlServer.ExecuteScalar();
在这种情况下,MAX 绝对不是任何人都会使用的。 最接近的解决方案是获取最近使用的标识值,然后将其增加 1(在您的情况下)或种子值,无论它是什么。
select ident_current('products') + 1
注意 - 虽然这暂时解决了您的目的,但请注意 'ident_current' 也会返回其他会话设置的标识值。 简而言之,如果有一些请求/触发器/执行导致 id 在您的按钮点击完成之前增加,那么您将获得 insert_id 而不是删除一个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.