Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删除最后一条记录后从数据库表中获取最大id号_C#_Asp.net_Sql Server - Fatal编程技术网

C# 删除最后一条记录后从数据库表中获取最大id号

C# 删除最后一条记录后从数据库表中获取最大id号,c#,asp.net,sql-server,C#,Asp.net,Sql Server,我想为“products”获取一个新行id,为此我使用MAX SQL命令如下(该命令位于insert new record button click事件中): 问题是当存在id为10,11,12(12为最大值)的行时,我删除id为12的记录,当新id行为13时,我得到最大值+1 id 12(“id”字段为PK,标识增量为1)。 我能用别的方法做吗 例如: id prodect -- ------- 1 dog 2 cat 3 mouse 4 elefant

我想为“products”获取一个新行id,为此我使用MAX SQL命令如下(该命令位于insert new record button click事件中):

问题是当存在id为10,11,12(12为最大值)的行时,我删除id为12的记录,当新id行为13时,我得到最大值+1 id 12(“id”字段为PK,标识增量为1)。 我能用别的方法做吗

例如:

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

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

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

我将尝试一下我认为您想要的东西。:)

如果包括选择范围_IDENTITY();在SQL中,您将获得所需的ID:

INSERT INTO products (
   * your fields *
)
VALUES (
   * your values *
);
SELECT SCOPE_IDENTITY();
然后在代码中,您可以有:

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

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

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

将新产品插入products表时,应尝试直接使用scope_identity函数(SQLServer!)检索新id:


在这种情况下,MAX肯定不是任何人都会使用的。最接近的解决方案是获取最近使用的标识值,然后将其增加1(在您的情况下)或种子值,不管它是什么

select ident_current('products') + 1

注意-尽管这现在解决了您的目的,但请注意“ident_current”也会返回其他会话设置的标识值。简单地说,如果有一些请求/触发器/执行导致id在您的按钮单击完成之前增加,那么您将获得插入的id,而不是删除的id

我怀疑实际的问题是
如何才能找到刚才插入的行的ID,以便在相关表或图像文件名中将其用作外键?

SQL Server自2005年起提供INSERT、UPDATE和DELETE语句,返回刚刚插入或修改的列的值。对于insert语句,语法为:

insert into Products (Product)
OUTPUT inserted.ID 
VALUES ('xxx')
这是一个比
IDENT_CURRENT
SCOPE_IDENTITY
值更好的选项,因为它使用单个语句返回值,并且返回的内容没有歧义:

  • IDENT_CURRENT
    如果多个用户在事务外部写入表,则可能返回不同的值
  • SCOPE\u IDENTITY
    返回事务中生成的最后一个ID,无论表是什么
您可以返回多个列:

insert into Products (Product)
OUTPUT inserted.ID, inserted.Product
VALUES ('xxx')
如果只返回一列,则可以使用ExecuteScalar执行此语句;如果要返回更多列,则可以使用ExecuteReader执行此语句

对于UPDATE或DELETE语句,
deleted
表包含已删除的值,
inserted
包含新值


注意类似于ORMs的实体框架已经使用这些语句来检索自动生成的ID并更新保存的对象。在这种情况下,只需读取已保存对象的ID属性。

如果您认为解决方案是“猜猜产品表中的下一个标识将是什么”SQLServer,您要解决的问题是什么?那么为什么不使用标识列呢?这正是为什么使用MAX+1是个坏主意-它可能会导致相同的ID分配给不同的记录。不要这样做,我正在尝试获取正在按钮单击事件中添加的新行ID。现在我用MAX(id)+1来做。问题是,当我删除最后一行时,我得到的id与已删除行相同,而新行得到的id为+1。我该怎么办?您无法猜测下一个数字是多少,因为多个用户可以同时添加记录,特别是在ASP.NET应用程序中。您可以通过在
INSERT
语句中使用
OUTPUT
子句返回新ID的值。标识列值始终保留。OP询问如何猜测下一个值,这很奇怪,在SQLServer2005+中(即在每个受支持的版本中)不需要这样做。您可以在末尾添加一个OUTPUT子句来返回新的ID值,例如:
OUTPUT inserted.ID
@Panagiotis-酷-对我来说是一个新的尝试。这是否适用于其他数据库,还是仅仅是MSSQL的东西?@Panagiotis Kanavos,使用UOTPUT时有任何风险吗?。它的确切代码是什么?如何获取输出id值以及“xxx”值是什么?
xxx
-您想插入到表中的任何内容。您只需更改
INSERT
语句即可添加
输出…
行。至于执行语句,请使用
ExecuteScalar
而不是
ExecuteNonQuery
。现在如何插入条目?然后使用
ExecuteScalar
检索使其正常工作的值:)。如何使用此输出将图像名称插入同一插入状态中的图像列中?
insert into Products (Product)
OUTPUT inserted.ID 
VALUES ('xxx')
insert into Products (Product)
OUTPUT inserted.ID, inserted.Product
VALUES ('xxx')