【问题标题】:How to close reader properly?如何正确关闭阅读器?
【发布时间】:2019-08-27 12:24:12
【问题描述】:

所以,我想检查该表是否存在于数据库中,如果存在则必须抛出一个 MessageBox。我的问题是,当我执行 Reader 时,我无法关闭它,并且出现以下错误:

已经有一个打开的 DataReader 与此 Connection 关联 必须先关闭。

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(),但似乎我必须做其他事情。有什么想法吗?

ps:“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;

            }
        }
    }
}

【问题讨论】:

标签: c# sql


【解决方案1】:

您应该始终在使用完任何实现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(); 来确保在cmd 执行之前没有打开的DataReader

【讨论】:

  • @mjwills:readercmd的执行有什么关系...?
  • 你或许应该让他们这样。显然我自己没有测试过这个,我也不倾向于自己执行两个不同的命令。你的观点可能是正确的。
  • @mjwills:我在执行cmd 之前添加了对reader.Close(); 的调用,稍微编辑了我的答案。
【解决方案2】:

连接短模板:

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
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    • 2023-01-02
    相关资源
    最近更新 更多