首页 > 解决方案 > 在 C# 中检测 MySQL“超时过期”错误的正确方法是什么?

问题描述

我想在我的应用程序中为 Data.MySqlClient 抛出的“超时过期”异常设置一个特殊情况。比检查异常的“消息”属性更好的检测方法是什么?

我尝试检查异常的“数字”属性的值 2013(我通过谷歌搜索找到的唯一一个),但它似乎并非在所有情况下都有效。编辑:做了一些额外的调试并发现,有时(即,当客户端发生超时时)数字== 0(这个数字也可以表示任何客户端错误)。

我当前的代码如下所示:

// connection is defined as new MySqlConnection
using(var transaction = connection.BeginTransaction(isolationLevel))
{
    try
    {
        using (var cmd = connection.CreateCommand())
        {
            cmd.Transaction = transaction;
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = query;
            cmd.ExecuteNonQuery();
            transaction.Commit();
        }
    }
    catch (Exception ex)
    {
        if (transaction != null && connection.State != ConnectionState.Closed)
        {
            transaction.Rollback();
        }
        log?.ErrorFormatExt(
                            "An error occurred during query execution. All changes canceled.{1}{0}{1}{2}", ex, Environment.NewLine,
                            query); // log is log4net.ILog.
        if (ex is MySqlException mySqlException && mySqlException.Number == TIMEOUT_NUMBER)// const int TIMEOUT_NUMBER = 2013
        {
          // Do special case stuff. Some nasty legacy code you surely don't want to see.
        }
    }
}

基本上我有时会看到日志条目(当然,带有“超时”文本),但没有看到任何特殊情况。尽管问题可能出在“特殊情况”部分,但现在我想确保我正在以正确的方式进行检查。

标签: c#mysql.net

解决方案


推荐阅读