我有一个类,我的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,所以我不知道为什么我在这一行得到这个错误。
答案 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())
{
//
}
}
}
}