C# 关闭连接/MySqlDataReader不';行不通
我有一个类,我的MysqlConnection在其中: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
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语句说明了这一点,但我认为可能值得先了解一下发生了什么?在你深入研究语法之前。