关闭Connection / MySqlDataReader不起作用

时间:2017-09-08 17:03:12

标签: c# mysql wpf

我有一个类,我的MysqlConnection在那里:

public class DB
{
    private static MySqlConnection _Connection;
    public static MySqlConnection Connection
    {
        get
        {
            if(_Connection == null)
            {
                string cs = string.Format("SERVER={0}; DATABASE={1}; UID={2}; PWD={3};", SERVER_ADRESS, DATABASE, UID, PWD);
                _Connection = new MySqlConnection(cs);
            }

            if(_Connection.State == System.Data.ConnectionState.Closed)
                try
                {
                    MessageBox.Show("MySQL Connection ist geschlossen. Öffne Sie");
                    _Connection.Open();
                }
                catch(MySqlException ex)
                {
                    switch (ex.Number)
                    {
                        case 0:
                            MessageBox.Show("Verbindung zum Server konnte nicht hergestellt werden.");
                            break;
                        case 1045:
                            MessageBox.Show("Ungültiger Benutzername/Passwort.");
                            break;
                        default:
                            MessageBox.Show(ex.Message);
                            break;
                    }
                }
            return _Connection;
        }
    }
}

所以我可以在DB.Connection的所有其他类中使用此连接。

但现在我得到“DataReader已经打开”。 但我所有的DataReader都在使用。

我们从登录页面开始:

using (loginreader = cmd.ExecuteReader())
            {
                if (loginreader.Read())
                {
                    DB.Connection.Close();
                    return true;
                }
                else
                {
                    DB.Connection.Close();
                    return false;
                }
               loginreader.Close();
            } 

我想这不起作用。但是登录后的第一个错误消息是第83行的另一个类:

DataTable schema = null;

            using (var schemaCommand = new MySqlCommand("SELECT * FROM " + firmCustomerTablename, connection))
            {
                using (var reader = schemaCommand.ExecuteReader(CommandBehavior.SchemaOnly))
                {
                    schema = reader.GetSchemaTable();
                }
            }

也在使用中。所以我不明白为什么我得到这个错误。我想关闭连接/ DataReaders不起作用。

在此更改之前,我为每个站点建立了连接。但我的节目没有很好的表现。所以我决定建立一个始终打开的连接,只需要查询这个开放的连接。现在我得到了DataReader错误。

有人可以解释一下,为什么使用不关闭DataReader?第83行不是DataReader,它是一个var,所以我不知道为什么我在这一行得到这个错误。

1 个答案:

答案 0 :(得分:1)

听起来您的问题与连接状态管理有关?我可能无法完全理解您所要求的内容,但通过连接上下文中的设计using语句将关闭连接。它们是try {} catch {} finally的语法糖。我经常看到连接对象,命令对象等的示例没有使用IDisposable而没有正确处理/关闭。

在此代码中,我没有看到再次打开连接以执行命令。

 DataTable schema = null;

        using (var schemaCommand = new MySqlCommand("SELECT * FROM " + firmCustomerTablename, connection))
        {
            using (var reader = schemaCommand.ExecuteReader(CommandBehavior.SchemaOnly))
            {
                schema = reader.GetSchemaTable();
            }
        }

这是一个基本想法:

        using (var conn = new SqlConnection(connectionString: ""))
        {
            conn.Open();

            using (var cmd = new SqlCommand(cmdText: "cmdText", connection: conn))
            {
                using (var reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        //
                    }
                }
            }

        }

文档:MSDN SqlConnection Class