C# 如何确保用户不尝试输入已存在的主键ID?

C# 如何确保用户不尝试输入已存在的主键ID?,c#,sql,sql-server,visual-studio,C#,Sql,Sql Server,Visual Studio,我有一个将宠物添加到SQL数据库的应用程序 目前,用户必须知道存在哪些PetID,因此必须知道可以添加哪些。如果用户试图输入一个已经存在的ID,程序将给出一个错误 我想我需要在页面加载时自动决定PetID(顶部文本框)值,该值不会与现有值冲突 有人能帮忙吗?我不知道怎么做 我需要页面加载来自动搜索SQL数据库中可用的PetID,选择值最低的一个,并自动将其放在文本框中,为用户做好准备(这样用户就不必担心选择一个尚未使用的) 如何在页面加载时在顶部文本框中等待可用的ID?还应确保用户无法尝试更改它

我有一个将宠物添加到SQL数据库的应用程序

目前,用户必须知道存在哪些PetID,因此必须知道可以添加哪些。如果用户试图输入一个已经存在的ID,程序将给出一个错误

我想我需要在页面加载时自动决定PetID(顶部文本框)值,该值不会与现有值冲突

有人能帮忙吗?我不知道怎么做

我需要页面加载来自动搜索SQL数据库中可用的PetID,选择值最低的一个,并自动将其放在文本框中,为用户做好准备(这样用户就不必担心选择一个尚未使用的)

如何在页面加载时在顶部文本框中等待可用的ID?还应确保用户无法尝试更改它


您可以按如下方式创建作为标识列的PetId:

[PetId] [int] IDENTITY(10,1) NOT NULL
因此,您不必手动添加它,每次添加宠物记录时,将自动生成PetId,这将是唯一的。因此,不会发生PetId的冲突

这里10表示第一个Id号,1表示如何增加您的PETID

问候,,
Pratik

通常在记录添加到数据库后输入数据并返回ID(使用
ID
列上的标识插入)


如果希望在创建数据之前显示下一个数字,则在不使用标识插入选项的情况下为
ID
使用整数列,并创建SQL Server序列。创建一个存储过程以返回要在创建页面中显示的下一个序列号

将id列设置为自动递增,不要让用户插入,由数据库自行决定。
或者您可以更改id列类型并使用
Guid.NewGuid()
生成新id。

一个选项是使用序列:

CREATE SEQUENCE pet_id_seq START WITH 7
我从7开始,因为它是第一个可用的
pet\u id

然后,在页面加载时,通过执行以下查询获取序列的下一个值:

SELECT (NEXT VALUE FOR pet_id_seq) AS next_pet_id
并在pet_id文本框中显示查询返回的值

这种方法有一个缺点,它会产生间隙,如果您打开页面,但实际上没有插入宠物行,则id将永远丢失。但我认为你不应该在意,有很多数字,你不会耗尽它们

另一个选项是使用以下查询填充宠物id文本框:

SELECT MAX(pet_id) + 1 AS next_pet_id FROM pets

但这一条有另一个缺点。它在并发场景中不能很好地工作。如果两个用户同时打开“创建宠物”页面,他们将获得相同的下一个宠物id,其中一个用户将获得主键冲突错误。

搜索可用id的含义可能重复?有预先生成的id,还是说最后一个id+1?您应该按照其他注释使用标识值。您不应该手动提供要插入的id,而应该在输出子句中插入后获取id的标识值。@BingoDingo您能告诉我们为什么不使用标识列吗?@kennyzx数据库不能确保自动递增的id,我得到一个错误。是的,同意,当用户希望按照自己的意愿保留PetId时,可能会出现这种情况。如果用户不介意的话,我们可以把它设为标识栏。你能在回答中描述一下“(10,1)”的功能吗?我已经这样做了,它已经起作用了,我在数据库中有6只宠物,但是宠物ID从10开始,它遗漏了ID 7、8和9…我如何才能使它在页面加载时将要选择的ID显示在顶部文本框中给用户?标识(10、1)表示第一个宠物ID是10,其他宠物ID是11、12、13、14。。。。等。您也可以写入,标识(1,1)以1开始,并以1递增,您将删除的PetId将不是免费的,它保存在后端。当您删除Id为6的宠物记录,并且您总共有10个宠物记录时,您将拥有1-5、7-10个Id。当你插入一个新的宠物记录时,它将被指定为11而不是6。要将新记录添加为PetId 6,您需要添加:SET IDENTITY_INSERT[].[]OFF,将此设置为OFF可使您手动输入PetId值,而不是增量。将只有一个用户。如何实现此功能?@BingoDingo您知道如何执行返回单个标量值的查询吗?您知道如何在文本框上显示标量值吗?。如果你没有,学习和尝试,如果你被卡住了,在这里问。但是我不会为你写代码,对不起,我怎么能做到这2点呢?不,我不知道如何执行查询以返回单个标量值,但是我认为我可能能够在文本框中显示该值。。。谷歌搜索标量值