c# - 关闭连接/MySqlDataReader 不起作用

标签 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 行上的另一个类(class):

DataTable schema = null;

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

这也在使用中。所以我不明白为什么会出现这个错误。我想关闭连接/数据读取器不起作用。

在此更改之前,我对每个站点都有一个连接。但我的程序表现不佳。因此,我决定建立 1 个始终打开的连接,并仅调用对此打开连接的查询。现在我收到 DataReader 错误。

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

最佳答案

听起来您的问题与连接状态管理有关?我可能不完全理解您的要求,但根据设计,连接上下文中的 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

关于c# - 关闭连接/MySqlDataReader 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46121412/

相关文章:

c# - 在ctor中带参数的Windsor依赖注入(inject)

c# - 通过 lambdas 构造 where 的表达式

c# - Subsonic 3 ActiveRecord 嵌套选择 NotIn 错误?

php - 同步本地和远程网站

java - 如何将日期选择器中的日期存储到mysql数据库中?

c# - 'void' 没有重载匹配委托(delegate) 'ThreadStart'

php - PHP 应用程序中的 MySQL 连接监视器

c# - 如何以编程方式显示 FocusVisualStyle?

c# - WPF Canvas 在绘制很多时卡住

c# - 如何从 xaml 访问 UserControl 中的按钮?