c# - 如何处理特定数据库错误的异常

标签 c# asp.net sql entity-framework

我正在尝试创建这样的交易:

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required,
      options))
{
    try
    {
        dbContext.MyTable.PartnerId = someGuid;
        dbContext.SaveChanges();
        scope.Complete();
        dbContext.AcceptAllChanges()
    }
    catch (Exception ex)
    {
        log.LogMessageToFile("Exception - ExceptionType: " + 
        ex.GetType().ToString() + "Exception Messsage: " + ex.Message);              
    }
}

我知道如果我尝试在 sql 中手动插入一个项目并在特定列中重复,我会从 sql 中收到以下错误:

Cannot insert duplicate key row in object 'dbo.MyTable' with unique index 'idx_PartnerId_notnull'. The duplicate key value is (7b072640-ca81-4513-a425-02bb3394dfad).

我如何以编程方式具体捕获此异常,以便我可以对其采取行动。

这是我对专栏的限制:

CREATE UNIQUE NONCLUSTERED INDEX idx_yourcolumn_notnull
ON YourTable(yourcolumn)
WHERE yourcolumn IS NOT NULL;

最佳答案

试试这个:

try {
}
catch (SqlException sqlEx) {
}
catch (Exception ex) {
}

发生在服务器端的SQL错误和警告被捕获在这个异常中。 在这里阅读: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlexception(v=vs.110).aspx

以上答案将允许您捕获 SqlException,但如果您只想通知用户特定错误,则需要进一步细化“SqlException”catch block 中的处理。 SqlException 类具有“ErrorCode”属性,您可以从中导出服务器产生的实际错误。尝试执行以下操作:

try 
{
}
catch (SqlException sqlEx) 
{
   if(sqlEx.ErrorCode == 2601)
   {
      handleDuplicateKeyException();
   }
}

2601 是 SQL Server 为您的特定错误生成的实际错误代码。要获得完整列表,只需运行 SQL:

SELECT * FROM sys.messages

关于c# - 如何处理特定数据库错误的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12635563/

相关文章:

c# - 在 gridview 上启用和禁用链接按钮

sql - 从varchar SQL Developer中删除前导零

c# - 覆盖 CompareTo : What to do with null case?

c# - 如何有效地索引文件?

asp.net - 将焦点设置在由 javascript 发起的回发上

asp.net - 将上传的文件作为 BLOB 存储在 DB 中或有限制的文件夹中,哪里更好?

sql - 自联接到表

mysql - 使用因子表计算假期日期,以从特定日期添加/减去天数

c# - 递归调用方法时防止 System.StackOverflowException

c# - 将 ASP.NET MVC Controller 属性注入(inject)服务层依赖项?