繁体   English   中英

如何让用户手动输入主键

[英]How to let the user to enter primary keys manually

我对我的ASP.NET网站有一个要求,该要求要求我让用户手动输入特定表的主键,如果用户输入了数据库中已经存在的主键,则系统应通知用户“主要已经存在”或类似的东西。

我正在考虑让用户输入主键,并且当他输入已经存在的键时,系统将抛出违反主键约束的异常。 因此,我将捕获该异常,并且在catch块中,我将显示一条错误消息,以通知用户有关主键重复的信息。 但是,我不确定这是正确的方法还是有标准的方法?

是的,这是一种有效的方法。 但是,有几件事需要提及:

  • 使用代理键 (计数器,GUID等)作为主键而不是用户输入的值(自然键)有很多优点,有关详细信息,请参见链接的文章。 如果您已经考虑过这一点,并决定使用自然键,那很好,我认为应该提到它。 如果使用代理键,则可以通过唯一索引确保用户定义值的唯一性。

  • 作为正常控制流的一部分,通常不赞成抛出异常:对现有键进行SELECT,然后INSERT会比等待异常发生更为优雅。 (使用事务和适当的事务隔离级别,以确保在SELECT和INSERT之间没有其他客户端可以插入任何行)。

在尝试将新记录插入数据库之前,只需对目标表进行查询以查看主键是否已经存在。 如果是这样,则向用户返回一条消息。

那太丑了。 在“常规”逻辑流中使用异常不是一个好主意-它使代码更难以阅读和维护,并且往往更慢(尽管您可能不会注意到性能影响)。

我将其拆分为“验证”方法,该方法应验证用户输入的数据-正确的数据类型吗? 是否符合最小长度要求? 它独特吗?

如果“验证”方法返回违规,则将其显示给用户。 给他们修复的机会。

如果“验证”方法未返回违规,请尝试插入记录,并捕获“重复键”异常(在验证和输入记录之间,可能有人输入了该记录)。

我不会讨论您是否应该这样做(我不认为您应该:p),但这是代码:

SET IDENTITY_INSERT TABLE ON

请记住,每个数据库只能将一个表设置为ON

MS Sql Server中的主键是唯一索引。 如果违反索引约束,数据库将引发错误并回滚事务。

如果您能够正确维护索引名称,则可以将您的解决方案提议用于其他情况。

恕我直言,这种方法很好。 通常,替代方法是询问数据库中值的存在。 如果找到了,那最终也将导致异常。 如果您决定让数据库引发异常,请不要忘记在代码文档中提及它。 因为在没有此类信息的情况下使用它可能会在将来引起一些问题。

为什么要打扰用户以构成主键并猜测要输入的内容以及是否已被使用呢? 我的意思是,我知道int是各种各样的数字,但是用户可能会尝试使用3-4位数字; 最终,他们将开始击球。 所以为什么?? 您不必要地使工作复杂化。

让数据库生成ID。 如有必要,向用户报告。 再简单不过了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM