SqlException约束违规。

4

我正在开发一个asp.net应用程序。 在捕获SqlException时,有没有一种方法可以知道哪个约束条件被违反了?


是的。我只想知道用户是否违反了唯一约束,这样应用程序就可以通知哪些插入的数据是错误的。 - DJPB
5个回答

8

SqlException有一个SqlError对象的集合:ErrorsSqlError具有错误Number的属性,您可以将其与已知的约束违规错误号(例如2627)进行比较。

虽然SqlException本身公开了Number属性,但如果在单个批处理中发生多个错误,则不准确,因此最好检查Errors集合。


4
catch (SqlException ex)
{
    if (ex.Errors.Count > 0) // Assume the interesting stuff is in the first error
    {
        switch (ex.Errors[0].Number)
        {
            case 547: // Foreign Key violation
                throw new InvalidOperationException("Your FK user-friendly description", ex);
                    break;
            // other cases
        }
    }
}

在这种特定情况下,您可以使用ex.Number以简化操作。 - Michael Logutov

2

如果我理解您的问题正确,您需要为ConstraintException添加异常处理程序。

try
{

}
catch(ConstraintException exc)
{
//exc.Message 
}

0
你是否让异常冒泡?如果你没有捕获它并在web.config中关闭自定义错误,我相信它会在你的浏览器中显示。如果你正在捕获它,我建议在catch部分设置断点并检查异常。

-1

最好的方法是在你的C#代码后台捕获这个异常。

catch(SqlException ex)
{
    if (ex.Message.Contains("UniqueConstraint"))
        throw new UniqueConstraintException();

    throw;
} 

你可以在数据层创建自己的异常并抛出,否则你可以像上面提到的那样直接捕获异常。

using System; 

public class UniqueConstraintException : Exception
{
} 

-1 用于“UniqueConstraintException : Exception”(绕过SqlException)。这是因为.NET框架中已经有“ConstraintException”。 - Victor Zakharov
@Neolisk 除了 ConstraintException 是 DataTable/DataRow 的一部分之外,由于 SqlException 是密封的,所以您无法从中继承。虽然您可以从 DbException 继承,我建议您这样做。 - Robert McKee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接