【问题标题】:c# Mysql There is already an open DataReader associated with this Connectionc# Mysql 已经有一个打开的 DataReader 与此 Connection 关联
【发布时间】:2014-12-08 19:13:13
【问题描述】:

大家好,我正在阅读时尝试做一些事情。我想要做的是编辑刚刚阅读的行。但我得到错误。也许你有一些建议我应该如何修复它,让它在不退出数据阅读器的情况下工作。 P.S:忽略这一点,查询对 SQL 注入开放。

string select = "Select * FROM ivykiai WHERE `Ivikio diena` MOD Periodiskumas_d = 0 AND `Ivikio diena` > 0 AND `Ivikio diena` < `Dif dien`";
MySqlCommand command = new MySqlCommand(select, cnn);
MySqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
    db1 = (now - Convert.ToDateTime(reader["Nuo"])).TotalDays;
    MessageBox.Show(db1.ToString());
    db1 = db1 - Convert.ToInt32(reader["Ivikio diena"]);
    MessageBox.Show(db1.ToString());
    b = Convert.ToInt32(db1) / Convert.ToInt32(reader["Periodiskumas_d"]);
    MessageBox.Show(b.ToString());
    a =+ Convert.ToInt32(reader["Suma"]);
    MessageBox.Show(a.ToString());
    a = a * b;
    MessageBox.Show(a.ToString());
    string prideti = "Update Lesos Set Grynieji=Grynieji + '"+ a +"'";
    MySqlCommand prideti_cmd = new MySqlCommand(prideti, cnn);
    string p = prideti_cmd.ExecuteNonQuery().ToString();
    string update = "UPDATE Ivikiai Set `Ivykio diena`+= '" + db1 + "'";
    MySqlCommand update_cmd = new MySqlCommand(update, cnn);
    string u = update_cmd.ExecuteNonQuery().ToString();
}
reader.Close();
cnn.Close();

【问题讨论】:

  • U 最好使用using 作为您的命令和阅读器,它们将被关闭而无需显式调用 .Close() 函数
  • 哪一行出现错误?
  • First ExecuteNonQuery 给出错误。
  • 当底层连接在第三行打开时尝试调用ExecuteNonQuery MySqlDataReader reader = command.ExecuteReader(); MySql 不支持 MARS。

标签: c# mysql


【解决方案1】:

您不能在while (reader.Read()) 块内使用相同的连接执行prideti_cmdupdate_cmd,并且reader 仍处于打开状态,但是您可以在while (reader.Read()) 块之外并在关闭reader 之后执行此操作.我建议创建以下类

public class MyClass
{
    public DateTime Nuo { get; set; }
    public int IvikioDiena { get; set; }
    public int Periodiskumas_d { get; set; }
    public int Suma { get; set; }
}

并如下更改您的代码

string select = "Select * FROM ivykiai WHERE `Ivikio diena` MOD Periodiskumas_d = 0 AND `Ivikio diena` > 0 AND `Ivikio diena` < `Dif dien`";
using (MySqlCommand command = new MySqlCommand(select, cnn))
{
    // execute the select query and store the results to list variable
    List<MyClass> list = new List<MyClass>();
    using (MySqlDataReader reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            MyClass record = new MyClass();
            record.Nuo = Convert.ToDateTime(reader["Nuo"]);
            record.IvikioDiena = Convert.ToInt32(reader["Ivikio diena"]);
            record.Periodiskumas_d = Convert.ToInt32(reader["Periodiskumas_d"]);
            record.Suma = Convert.ToInt32(reader["Suma"]);
            list.Add(record);
        }
    }

    // enumerate list and execute both the update queries
    foreach (var record in list)
    {
        db1 = (now - record.Nuo).TotalDays;
        MessageBox.Show(db1.ToString());
        db1 = db1 - record.IvikioDiena;
        MessageBox.Show(db1.ToString());
        b = Convert.ToInt32(db1) / record.Periodiskumas_d;
        MessageBox.Show(b.ToString());
        a =+ record.Suma;
        MessageBox.Show(a.ToString());
        a = a * b;
        MessageBox.Show(a.ToString());
        string prideti = "Update Lesos Set Grynieji=Grynieji + '"+ a +"'";
        MySqlCommand prideti_cmd = new MySqlCommand(prideti, cnn);
        string p = prideti_cmd.ExecuteNonQuery().ToString();
        string update = "UPDATE Ivikiai Set `Ivykio diena`+= '" + db1 + "'";
        MySqlCommand update_cmd = new MySqlCommand(update, cnn);
        string u = update_cmd.ExecuteNonQuery().ToString();
    }
}

【讨论】:

    【解决方案2】:

    通常你只能有一个活动命令 - SQL Server MARS 有点例外。

    因此,您不能使用具有开放阅读器的连接。您首先需要完成阅读,然后才能更新或使用另一个连接,这会给您带来事务隔离的麻烦。

    【讨论】:

    • 所以你的意思是没有办法绕过Datareader同时读取和执行查询?
    【解决方案3】:

    试试这个:

            using (MySqlConnection cnn = new MySqlConnection(dbConnectionString))
            {
                cnn.Open();
                MySqlCommand command = new MySqlCommand(select, cnn);
                using (MySqlDataReader reader = command.ExecuteReader())
                {
                    db1 = (now - Convert.ToDateTime(reader["Nuo"])).TotalDays;
                    MessageBox.Show(db1.ToString());
                    db1 = db1 - Convert.ToInt32(reader["Ivikio diena"]);
                    MessageBox.Show(db1.ToString());
                    b = Convert.ToInt32(db1) / Convert.ToInt32(reader["Periodiskumas_d"]);
                    MessageBox.Show(b.ToString());
                    a = +Convert.ToInt32(reader["Suma"]);
                    MessageBox.Show(a.ToString());
                    a = a * b;
                    MessageBox.Show(a.ToString());
                }
    
                string prideti = "Update Lesos Set Grynieji=Grynieji + '" + a + "'";
                MySqlCommand prideti_cmd = new MySqlCommand(prideti, cnn);
                string p = prideti_cmd.ExecuteNonQuery().ToString();
                string update = "UPDATE Ivikiai Set `Ivykio diena`+= '" + db1 + "'";
                MySqlCommand update_cmd = new MySqlCommand(update, cnn);
                string u = update_cmd.ExecuteNonQuery().ToString();
            }
    

    在读取数据时设置 ExecuteNonQuery() 所需的所有变量,因此您可以在 MySqlDataReader.ExecuteReader() 函数之外使用它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      • 2013-07-18
      • 1970-01-01
      • 1970-01-01
      • 2020-01-09
      • 2019-01-17
      • 2020-09-25
      相关资源
      最近更新 更多