c# - 在带或不带 try/catch 的 SQL 中使用唯一键作为验证数据完整性的有效方法

标签 c# sql-server try-catch

我有一个包含一些列的表,我在其中的 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");
            }

或者我应该在插入查询中执行 SELECT 以检查行是否存在以及它是否跳过插入?我读到将异常用作数据验证的一部分并不好,但有些东西应该这样使用(例如 How to check For File Lock in C#? 应该与 try/catch 一起使用)。

最佳答案

如果您有其他方法,则永远不要抛出和捕获异常。而你现在拥有了它。使用它!

您可以创建单个 sql 脚本或存储过程,使用 IF NOT EXISTS(SELECT ...) 检查和插入。进行两次查询速度较慢。

关于c# - 在带或不带 try/catch 的 SQL 中使用唯一键作为验证数据完整性的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10091199/

相关文章:

sql - 用数值替换 SQL 索引文本列会使其更快吗?

c# double.parse() 始终使用 .句号不是逗号

sql - 从两列中选择非不同的行

c# - Mkbundle Mono Assembly 绑定(bind)重定向

sql-server - SQL Server 2012 将 CSV 导入到映射列

c# - 在 finally block 上使用未分配的局部变量

Python - 重构 try/except block - 双重调用 super() 方法

exception - 在 GNU Octave 中,如何捕获异常

c# - 如何在不在键上获取 ArgumentException 的情况下合并两个字典?

c# - 调用 Web 服务时出现 HTTP 407 代理身份验证错误