【问题标题】:IC# - Im getting "The Connection is open" MYSQL databaseIC# - 我得到“连接已打开”MYSQL 数据库
【发布时间】:2019-01-17 17:40:14
【问题描述】:

我正在使用 Winforms、MySQL 和 C# 做一个大学出勤项目。 我想获取或添加“用户”。所以我为此编写了代码:

public bool GetUser(ref clsConnection c)
    {
        MySqlCommand query = new MySqlCommand();
        query.Connection = SQL;
        query.CommandText = "SELECT ";
        foreach (FieldInfo mi in typeof(clsConnection).GetFields())
        {
            foreach (StatsAttribute a in mi.GetCustomAttributes(typeof(StatsAttribute), false))
            {
                query.CommandText += a.Name + ", ";
            }
        }
        query.CommandText = query.CommandText.Substring(0, query.CommandText.Length - 2);
        query.CommandText += " FROM user WHERE User_Name='" + Escape(c.Username) + "'";
        query.Prepare();
        MySqlDataReader dr = query.ExecuteReader();
        if (dr.HasRows)
        {
            foreach (FieldInfo mi in typeof(clsConnection).GetFields())
            {
                foreach (StatsAttribute a in mi.GetCustomAttributes(typeof(StatsAttribute), false))
                {

                    dr.Read();
                    if (mi.FieldType.Name == "String")
                    {
                        mi.SetValue(c, (object)dr.GetString(a.Name));
                    }
                    else if (mi.FieldType.Name == "Double")
                    {
                        mi.SetValue(c, (object)dr.GetDouble(a.Name));
                    }
                    else if (mi.FieldType.Name == "Int32")
                    {
                        mi.SetValue(c, (object)dr.GetInt32(a.Name));
                    }
                    else if (mi.FieldType.Name == "UInt32")
                    {
                        mi.SetValue(c, (object)dr.GetUInt32(a.Name));
                    }
                    else if (mi.FieldType.Name == "Byte")
                    {
                        mi.SetValue(c, (object)dr.GetByte(a.Name));
                    }
                    else if (mi.FieldType.Name == "Boolean")
                    {
                        mi.SetValue(c, (object)dr.GetBoolean(a.Name));
                    }
                    else if (mi.FieldType.Name == "Date")
                    {
                        mi.SetValue(c, (object)dr.GetDateTime(a.Name));
                    }
                }
            }
        }
        else
        {
            dr.Close();
            return false;
        }
        dr.Close();
        return true;
    }

 public void AddUser(clsConnection c)
    {
        if (c.Username == "")
            return;
        List<string> users = new List<string>();
        List<string> values = new List<string>();
        int i = 0;
        foreach (FieldInfo mi in typeof(clsConnection).GetFields())
        {
            foreach (StatsAttribute a in mi.GetCustomAttributes(typeof(StatsAttribute), false))
            {
                users.Add(a.Name);
                values.Add("'" + mi.GetValue(c) + "'");
                i++;
            }
        }
        string query = "INSERT INTO user(" + string.Join(",", users.ToArray()) + ") VALUES (" + string.Join(",", values.ToArray()) + ");";
        Query(query);
    }

当我尝试连接新帐户或现有帐户时,出现“连接已打开”错误。我找不到我的问题在哪里...可能某个地方是 getuser 或 newuser 我没有关闭数据读取器,但找不到在哪里,请帮助我...

【问题讨论】:

  • 它实际上被抛出在哪一行?您应该能够调试并找到确切的行..
  • 我在日志文件中遇到错误并且没有行信息
  • 使用您可用的其他工具,而不仅仅是依赖您的日志文件。您应该能够运行任何体面的 IDE 并逐行调试它 带有断点并找出失败的地方。
  • 问题是这个问题并不总是出现,有时也加载不出来或者添加新用户。

标签: c# mysql connection datareader


【解决方案1】:

我不确定您是否在此处关闭连接。关闭“MySqlDataReader”后尝试添加。

query.Connection.Close();

另外,您可以在下面看到一个示例;

https://dev.mysql.com/doc/dev/connector-net/8.0/html/M_MySql_Data_MySqlClient_MySqlCommand_ExecuteReader.htm

【讨论】:

  • 对我没有帮助。我再次得到连接是打开的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
相关资源
最近更新 更多