c#Mysql已经有一个与此Connection关联的打开DataReader

时间:2014-12-08 19:13:14

标签: c# mysql

大家好,我正在尝试阅读时做一些事情。我想要做的是编辑刚读过的行。但我得到错误。也许你有一些建议我应该如何解决它,使其工作而不退出数据阅读器。 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();

3 个答案:

答案 0 :(得分:2)

您无法在prideti_cmd块内使用相同的连接执行update_cmdwhile (reader.Read()),而reader仍处于打开状态,但您可以在{{while (reader.Read())之外执行此操作1}}阻止并在关闭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();
    }
}

答案 1 :(得分:0)

通常,您只能拥有一个活动命令 - SQL Server MARS只是一个例外。

因此,您无法使用连接,因为它具有开放式读取器。您首先需要完成阅读,然后可以更新或使用其他连接,这将使您陷入事务隔离问题。

答案 2 :(得分:0)

试试这个:

        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()函数之外使用它们。