【问题标题】:Workaround for ASP throwing MySQL exceptionASP 抛出 MySQL 异常的解决方法
【发布时间】:2023-04-03 16:15:02
【问题描述】:

这需要一些解释。我是 ASP 的新手,来自 PHP。完全不同的世界。使用 MySql Connecter/Net 库,我决定制作一个数据库包装器,它具有相当数量的 fetch 方法,其中一个是“FetchColumn()”方法,它简单地将字符串作为其参数并使用以下实现:

public object FetchColumn(string query)
        {
            object result = 0;

            MySqlCommand cmd = new MySqlCommand(query, this.connection);

            bool hasRows = cmd.ExecuteReader().HasRows;

            if (!hasRows)
            {
                return false;
            }

            MySqlDataReader reader = cmd.ExecuteReader();

            int count = 0;

            while(reader.HasRows)
            {
                result = reader.GetValue(count);
                count++;
            }

            return result;
        }�          return result;
        }public object FetchColumn(string query)

我正在寻找的是一种返回 false IF 的方法,并且仅当查询尝试获取不存在的结果时。问题是,在我的实现中,它会引发错误/异常。可以这么说,我需要它在运行时“优雅地失败”。我应该提到的一件事是,通过这个实现,一旦分配了布尔值“hasRows”,应用程序就会抛出错误。为什么会这样,我不知道。

那么,有什么想法吗?

【问题讨论】:

  • 恐怕您需要阅读 C# 基础知识。我不认为result 会像你想象的那样。您应该可以跳过对ExecutReader() 的第二次呼叫。你到底在用count 做什么?
  • Fetch 接受字符串的命令是危险的。如果你不小心,你会发现你的数据库很快就被篡改了。了解如何进行参数化查询。

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


【解决方案1】:

很难确定,因为你没有发布它抛出的确切异常,但我怀疑问题是你在一个已经在使用的命令上调用ExecuteReader。正如documentation 所说:

在使用 MySqlDataReader 时,关联的 MySqlConnection 正忙于为 MySqlDataReader 提供服务。在此状态下,除了关闭 MySqlConnection 之外,不能对 MySqlConnection 执行其他操作。在调用 MySqlDataReader 的 MySqlDataReader.Close 方法之前都是这种情况。

您调用cmd.ExecuteReader() 来检查是否有行,然后再次调用ExecuteReader() 从行中获取数据。这不仅因为它违反了上面列出的条件而不起作用,而且如果它确实起作用,它的效率将非常低,因为它需要两次访问数据库。

按照我链接的文档中显示的示例,我会说您想要的是:

public object FetchColumn(string query)
{
    MySqlCommand cmd = new MySqlCommand(query, this.connection);
    MySqlDataReader reader = cmd.ExecuteReader();
    try
    {
        bool gotValue = false;
        while (reader.Read())
        {
            // do whatever you're doing to return a value
            gotValue = true;
        }
        if (gotValue)
        {
            // here, return whatever value you computed
        }
        else
        {
            return false;
        }
    }
    finally
    {
        reader.Close();
    }
}

我不确定你想用 HasRows 和计数等计算什么,但这应该会让你指向正确的方向。

【讨论】:

    【解决方案2】:

    你需要在抛出错误的代码中加上一个 try 子句

    try { 
        //The error throwing Code 
    } 
    catch (exception e)
    {
        //Error was encountered
        return false   
    }
    

    如果抛出错误的代码抛出错误并执行catch语句,如果没有抛出错误则忽略catch语句

    【讨论】:

      【解决方案3】:

      首先尝试并抓住

      try
              {
                  //code
              }
              catch (Exception exp)
              {
                  //show exp as message
              }
      

      你的错误的可能原因是你的mysql查询有错误。 尝试直接在您的 mysql 查询浏览器中执行您的查询,您就会得到答案。 如果它工作正常,请仔细检查您的连接字符串是否正确。

      注意:如果它解决了您的问题,请标记为答案

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多