因此,我想检查数据库中是否存在该表,如果存在,则必须抛出一个MessageBox。我的问题是,当我执行阅读器时,无法将其关闭,并且出现以下错误:
已经有与此连接关联的打开的DataReader 必须先关闭。
string query2 = $"SHOW TABLES WHERE Tables_in_appdb LIKE '%{tableNamee}%'";
var conn = new MySqlConnection(dbConnectionString);
conn.Open();
var cmd2 = new MySqlCommand(query2, conn);
var reader = cmd2.ExecuteReader();
if (reader.Read())
{
ia.flag = "stop";
cmd2.Cancel();
reader.Close();
}
else
{
cmd.ExecuteNonQuery();
ia.flag = "continue";
cmd2.Cancel();
reader.Close();
}
conn.Close();
return true;
我正在使用reader.Close()
,但似乎我还需要做其他事情。有什么想法吗?
p.s .:如果表存在或不存在,“ ia.flag”只是我想传递给其他类的字符串。
编辑 这有效:
string query2 = $"SHOW TABLES WHERE Tables_in_appdb LIKE '%{tableNamee}%'";
using (var conn = new MySqlConnection(dbConnectionString))
{
conn.Open();
var cmd = new MySqlCommand(query, conn);
//using(var cmd1 ) ..)
using (var cmd2 = new MySqlCommand(query2, conn))
{
using (var reader = cmd2.ExecuteReader())
{
if (reader.Read())
{
reader.Close();
MessageBox.Show("Ime ankete vec postoji, odaberite drugo!");
flag = false;
conn.Close();
return false;
}
else
{
reader.Close();
flag = true;
cmd.ExecuteNonQuery();
conn.Close();
return true;
}
}
}
}
答案 0 :(得分:4)
使用完IDisposable
的任何对象后,都应立即对其进行处置(这也包括命令和连接):
string query2 = $"SHOW TABLES WHERE Tables_in_appdb LIKE '%{tableNamee}%'";
using (var conn = new MySqlConnection(dbConnectionString))
{
conn.Open();
//using(var cmd1 ) ..)
using (var cmd2 = new MySqlCommand(query2, conn))
{
using (var reader = cmd2.ExecuteReader())
{
if (reader.Read())
{
ia.flag = "stop";
return false;
}
else
{
reader.Close();
cmd.ExecuteNonQuery();
ia.flag = "continue";
return true;
}
}
}
}
请注意,我们已经使用reader.Close();
来确保在执行DataReader
之前没有打开的cmd
。
答案 1 :(得分:0)
用于连接的短模板:
using(MySqlConnection connect = new MySqlConnection(dbConnectionString))
using(MySqlCommand cmd = new MySqlCommand())
{
cmd.CommandText = query2;
cmd.Connection = connect;
cmd.Connection.Open();
using(MySqlDataReader msdr = cmd.ExecuteReader())
{
// do stuff
}
}