如何将SqlException消息转换为用户友好的消息

4

我希望能够获取以下异常中所有被替换的值,从UI获得错误消息以显示到更细粒度的自定义消息。

UPDATE语句与FOREIGN KEY约束“FK_Parameter_Status”冲突。该冲突出现在数据库“LIMS”的表“dbo.Status”中,列“StatusId”。

%ls语句与%ls约束“%.*ls”冲突。该冲突出现在数据库“%.*ls”的表“%.*ls”%ls%.*ls%ls。

我注意到

%ls将被替换为UPDATEFOREIGN KEY等。

在C#中,我将从错误消息中提取由SQL Server替换的部分。我将在我的库中维护SqlErrors并用自定义消息替换它们。

我想要显示的自定义消息例如:

string.Format("{0} failed!, incorrect value was supplied for {1} field", "UPDATE", "Status")

如果您有复合外键,则可能无法将问题归咎于特定列。 - Martin Smith
你走在正确的道路上,使用正则表达式来匹配所需字段。创建一个全局异常处理机制,在其中将SQL异常转换为自定义异常(例如ASP.NET中的Application_Error)。 - Karel Frajták
@MartinSmith:我明白了你的提示。我愿意接受任何建议。我也希望基于假设得到答案,例如我的数据库永远不会包含复合外键(这在我的情况下并不正确)。那么我该怎么做呢? - Shantanu Gupta
1个回答

2

SQLException有一个名为Number的属性,您可以使用此编号,然后将其翻译为任何您想要的文本。

public static string GetSqlExceptionMessage(int number)
{
  //set default value which is the generic exception message
  string error = MyConfiguration.Texts.GetString(ExceptionKeys.DalExceptionOccured);   
  switch (number)
  {
    case 4060:
      // Invalid Database
      error = MyConfiguration.Texts.GetString(ExceptionKeys.DalFailedToConnectToTheDB);   
    break;
    case 18456:
      // Login Failed
      error = MyConfiguration.Texts.GetString(ExceptionKeys.DalFailedToLogin);   
    break;
    case 547:
      // ForeignKey Violation
      error = MyConfiguration.Texts.GetString(ExceptionKeys.DalFKViolation);   
    break;
    case 2627:
      // Unique Index/Constriant Violation
      error = MyConfiguration.Texts.GetString(ExceptionKeys.DalUniqueConstraintViolation);
    break;
    case 2601:
      // Unique Index/Constriant Violation
      error =MyConfiguration.Texts.GetString(ExceptionKeys.DalUniqueConstraintViolation);   
    break;
    default:
      // throw a general DAL Exception
      MyConfiguration.Texts.GetString(ExceptionKeys.DalExceptionOccured);   
    break;
  }

  return error;
}

从以下示例代码中复制: 使用其错误编号获取SqlException友好错误消息


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