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# 如何让用户手动输入主键_C#_Asp.net_Sql Server_Database - Fatal编程技术网

C# 如何让用户手动输入主键

C# 如何让用户手动输入主键,c#,asp.net,sql-server,database,C#,Asp.net,Sql Server,Database,我对我的ASP.NET网站有一个要求,要求我允许用户手动输入特定表的主键,如果用户输入的主键已经存在于数据库中,系统应通知用户为“primary ready exist”或类似的内容 我想让用户输入主键,当他输入一个已经存在的键时,系统将抛出一个违反主键约束的异常。因此,我将捕获该异常,并在catch块中显示一条错误消息,通知用户主键的复制。然而,我不确定这是一种正确的方法,或者是否有任何标准的方法来做到这一点 在尝试在数据库中插入新记录之前,只需对目标表进行查询,查看主键是否已经存在。如果是,

我对我的ASP.NET网站有一个要求,要求我允许用户手动输入特定表的主键,如果用户输入的主键已经存在于数据库中,系统应通知用户为“primary ready exist”或类似的内容


我想让用户输入主键,当他输入一个已经存在的键时,系统将抛出一个违反主键约束的异常。因此,我将捕获该异常,并在catch块中显示一条错误消息,通知用户主键的复制。然而,我不确定这是一种正确的方法,或者是否有任何标准的方法来做到这一点

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

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

这太难看了。在“正常”逻辑流中使用异常不是一个好主意——它会使代码更难阅读和维护,而且往往速度较慢(尽管您可能不会注意到性能影响)

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

如果“validate”方法返回一个冲突,则将其显示给用户;给他们机会去解决它


如果“validate”方法没有返回冲突,请尝试插入记录,并捕获“duplicate key”异常(在验证和输入记录之间的时间内,其他人可能已经输入了该记录)

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

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

如果“validate”方法返回一个冲突,则将其显示给用户;给他们机会去解决它


如果“validate”方法没有返回冲突,请尝试插入记录,并捕获“duplicate key”异常(在验证和输入记录之间的时间内,其他人可能已经输入了该记录)

我不会讨论你是否应该这样做(顺便说一句,我不认为你应该这样做:p),但这是代码:

SET IDENTITY_INSERT TABLE ON

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

我不会讨论您是否应该这样做(顺便说一下,我不认为您应该这样做:p),但下面是代码:

SET IDENTITY_INSERT TABLE ON

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

是的,这是一种有效的方法。不过,有几件事值得一提:

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

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


  • 是的,这是一种有效的方法。不过,有几件事值得一提:

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

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


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

    如果您能够正确地维护索引名称,那么您将能够在其他情况下使用建议的解决方案


    嗯,这种方法很好。通常的替代方法是询问数据库中是否存在值。如果被发现,最终也会出现一个例外。如果您决定让db引发异常,请不要忘记在代码文档中提到这一点。因为在没有这些信息的情况下使用它可能会在将来导致一些问题

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

    如果您能够正确地维护索引名称,那么您将能够在其他情况下使用建议的解决方案

    嗯,这种方法很好。通常的替代方法是询问数据库中是否存在值。如果被发现,最终也会出现一个例外。如果