C# 在SQL中使用Unique Key(带或不带try/catch)作为验证数据完整性的有效方法

C# 在SQL中使用Unique Key(带或不带try/catch)作为验证数据完整性的有效方法,c#,sql-server,try-catch,C#,Sql Server,Try Catch,我有一个包含一些列的表,我在其中的3列上设置了唯一键,以确保表中没有重复项。现在我想知道,使用try/catch吞下重复的异常并继续更新在foreach中插入下一行是否是一个好方法 try { sqlWrite.ExecuteNonQuery(); } catch (SqlException sqlException) { if (!sqlException.ToString().Co

我有一个包含一些列的表,我在其中的3列上设置了唯一键,以确保表中没有重复项。现在我想知道,使用try/catch吞下重复的异常并继续更新在
foreach
中插入下一行是否是一个好方法

            try {
                sqlWrite.ExecuteNonQuery();
            } catch (SqlException sqlException) {
                if (!sqlException.ToString().Contains("Violation of UNIQUE KEY constraint")) {
                    MessageBox.Show("Error - " + Environment.NewLine + sqlException.ToString(), "Error SQL");
                }
            } catch (Exception exception) {
                MessageBox.Show("Error - " + Environment.NewLine + exception.ToString(), "Error SQL");
            }

或者我应该选择insert查询来检查行是否存在以及是否跳过insert?我已经读到,在数据验证中使用异常是不好的,但是有些东西应该这样使用(例如,应该与try/catch一起使用)

如果有其他方法,则永远不要抛出并捕获异常。现在你有了。用它


您可以创建一个sql脚本或存储过程,用于检查和插入
(如果不存在)(选择…
)。进行两次查询比较慢。

我通常会说主键关系应该是数据验证的最后一个和后退位置。如果您的程序已经走了这么远,并且试图插入一个不符合唯一键的行,则说明出现了严重错误

在最简单的情况下,情况并不太糟。对于插入一行,没有任何其他依赖项,您可以提出这样一个论点:尝试插入记录并抛出捕获的错误可能比执行select以查看ID是否已经存在更有效


现在,考虑一个事务,您可能一次插入/更新10行甚至数百行。每一行都有一个唯一的键,任何一行都可能抛出错误。当发现错误时,DB必须回滚整个事务。当然C#有一个事务模式,但是您必须回滚数据库,回滚插入记录时可能已更新的任何对象。它变得非常复杂,非常快。

他实际上并没有抛出异常,而是抓住了异常。不过我同意,例外情况是特殊情况:)他并没有明确地抛出它,而是间接抛出它。。。只是一点意思:)呵呵,只是吹毛求疵:),他抓住了,不是直接或间接地扔的:)谢谢。如果不存在,我将添加并保留try/catch,以防有多人同时插入内容。谢谢。这就是为什么我无论如何都会离开try/catch,但如果JotaBe建议的不存在的话,就去做。谢谢。我会读的。