c# - 捕获唯一键违规的通用方法

标签 c# exception sqlexception dbcommand

我使用 System.Data.Common.DbCommand 向数据库中插入一个新行。关键是,这一行已经存在。

try
{
    [...]
    DbCommand insertCommand = [...]
    insertCommand.ExecuteScalar();
    [...]
}
catch (System.Exception exception)
{
   [...]
   throw;
}

如果我显式捕获 System.Data.SqlClient.SqlException,我可以像下面这样评估 ErrorNumber。

try
{
  //insertion code
}
catch(SqlException ex)
{
  if(ex.Number == 2627)
  {
     //Violation of primary key. Handle Exception
  }
}

SqlException 上下文中的 ErrorNumber 2627 表示违反唯一键。参见 https://msdn.microsoft.com/en-us/library/ms151757%28v=sql.110%29.aspx

到目前为止一切顺利。因为我正在使用 DbCommand 并因此使用不同类型的关系数据库管理系统,所以我正在寻找一种更通用的方式来捕获这种违反唯一键约束的情况。

感谢您的帮助。

最佳答案

恐怕没有内置的通用解决方案。作为解决方法,您可以为 Execute... 创建一个包装器:

public static int ExecuteWithNiceExceptions(this IDbCommand cmd)
{
    try
    {
        return cmd.ExecuteNonQuery();
    }
    catch(SqlException ex)
    {
        if (ex.Number == 2627)
        {
            throw new PrimaryKeyViolationException(cmd, ex);
        }
        else
        {
            throw;
        }
    }
    catch (OleDbException ex)
    {
        ... 
    }
    ...
}

这样,您就可以将不同的、特定于实现的异常“转换”为通用的、有意义的异常。

关于c# - 捕获唯一键违规的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28961411/

相关文章:

c# - 不一致的行为 : no exception is thrown in the List<T>. 在 foreach 循环中调用时的排序方法

c# - 从另一个线程访问单例对象

c# - 如何使用 C# 和 LINQ to Twitter 库更新 Twitter 上的状态

java - 如何将 XML(字符串)转换为有效文档?

flutter - 找不到正确的提供者

c# - 是否可能抛出 SqlException 并且属性 Number == 0?

c# - 数据库中已经有一个名为 'tableName' 的对象

c# - 命名约定 - C++ 和 C# 变量中的下划线

c# - 如何重定向到另一个网址

c# - sqldatetime溢出异常c#.NET