Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.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
Asp.net SQL:如果记录不存在,则插入记录的最佳实践';不存在_Asp.net_Sql Server - Fatal编程技术网

Asp.net SQL:如果记录不存在,则插入记录的最佳实践';不存在

Asp.net SQL:如果记录不存在,则插入记录的最佳实践';不存在,asp.net,sql-server,Asp.net,Sql Server,我有一个asp.net Gridview,可以处理SQL数据库中的插入操作。仅当记录满足唯一性条件时才允许插入记录,并且使用SQL server中的唯一索引强制执行此约束。如果用户试图插入已存在的记录,将显示错误消息 我想知道实现这一点的最佳实践是什么 使用if exists和锁定提示(updlock、holdlock等)检查记录在SQL端是否存在。根据是否插入记录,将错误代码返回到ASP.net 在SQL server try/catch块内执行插入操作,如果记录存在,则依赖唯一索引防止插入。

我有一个asp.net Gridview,可以处理SQL数据库中的插入操作。仅当记录满足唯一性条件时才允许插入记录,并且使用SQL server中的唯一索引强制执行此约束。如果用户试图插入已存在的记录,将显示错误消息

我想知道实现这一点的最佳实践是什么

  • 使用if exists和锁定提示(updlock、holdlock等)检查记录在SQL端是否存在。根据是否插入记录,将错误代码返回到ASP.net
  • 在SQL server try/catch块内执行插入操作,如果记录存在,则依赖唯一索引防止插入。根据是否引发异常返回错误代码
  • 在SQL端执行插入操作,但不使用SQL try/catch。改为在ASP.net内处理PK冲突异常

  • 通常,我会考虑使用异常来处理有效的操作,这是不好的实践,即软件不应该抛出异常,除非有什么东西被破坏了。但是,如果SQL中表上的唯一索引要实现所需的约束,为什么还要执行手动检查记录是否存在?

    我会单独调用以检查记录是否已经存在。如果是,则向用户显示消息,如果否,则进行插入。我之所以这样做,是因为我更喜欢保留应用程序中的所有业务逻辑

    如果您坚持只进行一次存储过程调用:


    我会在插入之前检查。我还将向存储的proc添加一个输出参数,如果插入失败,该参数将返回一条消息。在我的应用程序中,如果我在输出参数中看到消息,我将向用户显示该消息。

    MERGE在我使用的SQL版本(2005)中不可用,如果记录已经存在,我不想更新它。如果记录存在,则如果您的约束键选项1上有索引,则会向用户显示通知。这可能是无例外且快速实现此功能的最佳方法。您可以将IF-EXISTS逻辑放入一个而非触发器中,并检查是否存在。您还可以将执行IF-EXISTS逻辑的proc放入,并让INSTEAD-OF触发器作为为您自动调用它的方法。好处是,所有尝试插入的应用程序逻辑都将为他们准备好这一点,因此您可以一次性进行更改,并可以说是在全球范围内强制执行。