Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关闭连接/MySqlDataReader不';行不通_C#_Mysql_Wpf - Fatal编程技术网

C# 关闭连接/MySqlDataReader不';行不通

C# 关闭连接/MySqlDataReader不';行不通,c#,mysql,wpf,C#,Mysql,Wpf,我有一个类,我的MysqlConnection在其中: public class DB { private static MySqlConnection _Connection; public static MySqlConnection Connection { get { if(_Connection == null) { string cs = strin

我有一个类,我的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已经打开了”。 但我所有的数据阅读器都在使用中

我们从我的登录页面开始:

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();
                }
            }
这也是一种使用方式。所以我不明白为什么会出现这个错误。我想关闭连接/数据读取器不起作用

在此更改之前,我为每个站点都建立了连接。但是我的程序没有很好的表现。所以我决定建立一个始终打开的连接,只需调用querys来打开这个连接。现在我得到了DataReader错误


有人能给我解释一下,为什么不关闭DataReader?第83行不是DataReader,它是一个var,所以我不知道为什么在这一行出现这个错误。

听起来您的问题是关于连接状态管理的?我可能不完全理解您的要求,但通过设计
在连接上下文中使用
语句将关闭连接。它们是
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())
                    {
                        //
                    }
                }
            }

        }

文档:

为整个实例提供一个静态连接不是一个好的解决方案。您应该为执行的每个查询或更新打开连接。这样做会导致更多的问题超出你所描述的范围。如果这是导致性能低下的原因,请解决该问题(确保连接池正确连接、及时处理/关闭连接等)。每5秒打开一次连接会降低性能。因为所有的东西都会从数据库中读取。单击按钮可打开包含数据库内容的窗口。再次点击另一个按钮等。每5秒创建一次连接不应该影响性能。如果是,则说明某些设置不正确。你是否真的证实了它正在发生或只是假设?请看:我建议展示如何安全地关闭连接,因为这也是他最初的问题。您可以从添加
cmd.ExecuteReader(CommandBehavior.CloseConnection)
开始。这将自动关闭读循环完成的读卡器。因此,您不需要检查读卡器状态。你可以简单地使用null propergation,然后关闭连接。我知道你的using语句说明了这一点,但我认为可能值得先了解一下发生了什么?在你深入研究语法之前。