如何正确关闭阅读器?

时间:2019-08-27 12:24:12

标签: c# sql

因此,我想检查数据库中是否存在该表,如果存在,则必须抛出一个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;

            }
        }
    }
}

2 个答案:

答案 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
    }
}
相关问题