【问题标题】:C# MySQL/Connector Number always 0C# MySQL/连接器编号始终为 0
【发布时间】:2014-07-22 22:35:40
【问题描述】:
connectionString = "SERVER=localhost;DATABASE=NT;UID=" + dbuser + ";PASSWORD=" + dbpass + ";";

connection = new MySqlConnection(connectionString);

OpenConnection();


//open connection to database
    private bool OpenConnection()
    {
        try
        {
            connection.Open();
            return true;
        }
        catch (MySqlException ex)
        {
            //The two most common error numbers when connecting are as follows:
            //0: Cannot connect to server.
            //1045: Invalid user name and/or password.
            switch (ex.Number)
            {
                case 0:
                    Console.WriteLine(" >>>> Cannot contact MySQL Server ");//MessageBox.Show("Cannot connect to server.  Contact administrator");
                    break;

                case 1045:
                    Console.WriteLine(" >>>> Invalid username/password, please try again");
                    break;

                case 1042:
                    Console.WriteLine(" >>>> Unable to resolve DNS");
                    break;
            }
            return false;
        }
    }

上面的代码成功连接到 localhost 数据库并登录,但数据库“NT”不存在(我知道)但 ex.Number 属性设置为 0 我也遇到了错误的用户名/密码组合的问题。 异常消息/文本为我提供了错误字符串,但数字字段始终设置为 0。任何帮助将不胜感激。

非常感谢, 本

编辑/更新

两个屏幕截图之间的唯一区别是我将 NT 更改为测试(NT 不存在(消息报告正确但不是数字)并且测试确实存在)

我想知道这是否可能是预期的行为?它基本上是因为该数据库不存在而拒绝连接吗?

【问题讨论】:

  • 是的,我确信它正在连接到数据库,因为我得到了关于它无法找到正确数据库的内部异常,并且当我得到用户/传递错误时,消息说。如果我登录正确,那么它会连接并说数据库不存在(我故意选择不存在来测试)
  • 如果在连接字符串上设置端口号怎么办? PORT="8080";
  • 奇怪的是,如果我把连接字符串弄乱了说“localhost”而不是“localhost”,然后它给了我一个 1042 并显示一条消息“无法连接到任何指定的 MySQL 主机”。所以它似乎在连接时没有号码

标签: c# mysql mysql-connector


【解决方案1】:

我正在使用 MySql Connector .Net 6.9.4 并且也遇到了这个问题。我发现有一个 MySqlException 类型的 InnerException 具有错误号。你可以试试我的辅助方法:

public static int GetExceptionNumber(MySqlException my)
{
    if (my != null)
    {
        int number = my.Number;
        //if the number is zero, try to get the number of the inner exception
        if (number == 0 && (my = my.InnerException as MySqlException) != null)
        {
            number = my.Number;
        }
        return number;
    }
    return -1;
}

问候

弗兰克

【讨论】:

  • 这是(最接近的)正确答案。该数字仅存在于内部异常中。
【解决方案2】:

不要像这样设置PASSWORD,而是PWD

connectionString = "SERVER=localhost;DATABASE=NT;UID=" + dbuser + ";PWD=" + dbpass + ";";

【讨论】:

  • 同样的结果。内部异常说未知数据库(正确,因为我知道数据库 NT 不存在)一切正常(当数据库存在时,使用正确的用户名和密码)但我需要获取错误代码。
  • 看看接受的答案,这可能很有趣:stackoverflow.com/questions/22557433/…
【解决方案3】:

我也遇到了同样的问题。 我认为是连接器/网络的错误。 请在以下代码中更正并尝试。

switch (ex.InnerException.Number)
{

在 6.9.8 中测试过。

【讨论】:

    【解决方案4】:

    我自己也遇到过同样的问题,看来Number字段只填写了内部异常。我不知道为什么会这样,但MySqlException 包含一个内部异常也属于MySqlException 类型,并且内部异常有编号。

    因此,要获得数字,您可能应该使用以下内容:

    int number;
    if (ex.InnerException != null && ex.InnerException is MySqlException)
    {
        number = ((MySqlException) ex.InnerException).Number;
    }
    else
    {
        number = ex.Number;
    }
    

    这包括对内部异常的空检查和类型检查,如果没有内部异常或类型错误,则回退到外部异常中的数字。

    【讨论】:

      猜你喜欢
      • 2012-12-30
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      • 2012-08-15
      • 2023-03-10
      • 2014-01-09
      • 1970-01-01
      相关资源
      最近更新 更多