我可以获取在MySQL中导致重复异常的特定字段吗?

时间:2013-08-30 14:16:06

标签: c# mysql asp.net exception-handling

我使用ASP.NET C#将记录插入MySql数据库。我有一个类似于此的方法:

public bool InsertRecord()
{
    string message;
    try
    {
        //Insert and Save
        return true;
    }
    catch(Exception ex)
    {

         if(ex.InnerException != null)
         {
             message = ex.InnerException is MySqlException
             ? MySqlErrors.GetMySqlErrorMessage(((MySqlException)ex.InnerException).Number)
             : ex.InnerException.Message;
         }
         else
         {
              message = ex.Message;
         }

         return false;
     }
 }

目前,如果它进入捕获,Message的{​​{1}}属性为:

Exception

这对用户来说很神秘,所以我很好奇是否有办法获得有关哪些字段导致重复异常的具体信息,例如"Duplicate entry 'xxxxx-bbbbb' for key 'index_1""Field B already exists in the in table".

如果很容易获得特定领域,我想到了另外两个选项,并希望对它们提出意见。他们是:

  1. 我知道哪个字段会导致重复错误,所以我认为我可能更具体的一种方法是检查数据库中是否已存在包含字段的记录,如果存在,则报告对用户而言。这样,我避免了异常,但需要额外的数据库调用。

  2. 我想的另一种方法是为特定的异常设置另一个类,我可以存储关键或唯一字段的字段,例如,如果用户尝试更新汽车表并且VIN是唯一的,我可以简单地捕获异常,但由于我知道他们正在尝试更新哪个表,我可以说:"Field A and B" already exist in the table".

1 个答案:

答案 0 :(得分:0)

在消息中

  

“密钥'index_1'的重复条目'xxxxx-bbbbb'”

  • index_1是即将违反的约束的名称
  • xxxxx-bbbbb是可能已插入的重复值。

通过解析表定义(例如SHOW CREATE TABLE the_table),您可以推断出涉及哪些字段。

[编辑]

通过查询information_schema数据库来检索所涉及的列可能更容易:

SELECT column_name
FROM information_schema.key_column_usage
WHERE constraint_schema = DATABASE()
AND table_name = '<your table name>'
AND constraint_name = '<constraint name>';