"已经有一个与此连接关联的开放DataReader"错误

时间:2015-06-25 04:45:19

标签: c# sql sql-server

我有这个c#代码:

using (SqlConnection db = Database.Connection)
{
    db.Open();
    string selectString = "SELECT id, numwave, CAST(kol_fakt AS int) AS kol_fakt FROM sorters WHERE numdoc=@numDoc AND kodprod=@kodProd AND     numpallet=@numPal";
    try
    {
        SqlCommand command = new SqlCommand(selectString, db);
        command.Parameters.AddWithValue("@numDoc", numDoc);
        command.Parameters.AddWithValue("@kodProd", kodProd);
        command.Parameters.AddWithValue("@numPal", numPal);
        SqlDataReader reader = command.ExecuteReader();
        while (reader.Read() && reduseLeft > 0)
        {
            FUid = "";
            FUnumwave = "";
            FUkolfakt = 0;

            FUid = reader["id"].ToString();
            FUnumwave = reader["numwave"].ToString();
            FUkolfakt = (int)reader["kol_fakt"];
            if (FUkolfakt >= reduseLeft)
            {
                string updateString = "UPDATE sorters SET kol_fakt=@kolfakt WHERE numwave=@numwave AND id=@id";
                try
                {
                    SqlCommand upCommand = new SqlCommand(updateString, db);
                    upCommand.Parameters.AddWithValue("kol_fakt", (FUkolfakt - reduseLeft).ToString());
                    upCommand.ExecuteNonQuery();//HERE ERROR
                    reduseLeft = 0;
                }
                catch (Exception ex)
                {
                }
            }
        }
    }
    catch (Exception ex)
    {
    }
    db.Close();
}

我收到此错误消息:

  

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

我需要在SqlCommand中创建SqlCommand,我该怎么做?

3 个答案:

答案 0 :(得分:4)

您仍在阅读器中使用相同的连接。尝试在此处打开新连接

SqlCommand upCommand = new SqlCommand(updateString, db);
upCommand.Parameters.AddWithValue("kol_fakt", (FUkolfakt - reduseLeft).ToString());
upCommand.ExecuteNonQuery();//HERE ERROR
reduseLeft = 0;

尽管如此,您最好重新组织代码,以便在仍然从上一个连接中读取时不需要打开新连接。

答案 1 :(得分:3)

要执行您想要的操作,您必须打开与数据库的第二个连接(您实际上不应该保持连接存活,只需在需要时打开它们.NET将使用Connection Pooling在内部重新连接减少资源)或启用" Multiple Active Result Sets"在用于在Database.Connection

中创建连接的连接字符串中

答案 2 :(得分:0)

如果您的数据没有太多记录,您可以使用数据集或列表。

如果记录太多而无法记忆。尝试为SqlCommnad打开一个新连接。并将SqlCommand移出while循环并调用Prepare方法。

如果可能,最好使用存储过程。