";已经有一个打开的DataReader与这个连接“相关联;错误

本文关键字:连接 关联 错误 相关联 DataReader quot 有一个 | 更新日期: 2023-09-27 17:59:28

我有这个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();
}

我收到这个错误消息:

已经有一个打开的DataReader与此连接或命令关联,必须首先关闭。

我需要在SqlCommand中创建SqlCommand,如何做到这一点?

";已经有一个打开的DataReader与这个连接“相关联;错误

在读卡器中仍在使用同一连接时,您正在重用该连接。尝试在此处打开新连接

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

不过,您最好重新组织您的代码,这样您就不需要在读取前一个连接的同时打开新的连接。

要执行您想要的操作,您必须打开到数据库的第二个连接(您真的不应该保持连接处于活动状态,只需根据需要打开它们即可。NET将使用连接池在内部重新使用连接以减少资源)或在用于在Database.Connection 中创建连接的连接字符串中启用"多个活动结果集"

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

如果记录太多而无法放入内存。尝试打开SqlCommnad的新连接。并将SqlCommand移出while循环并调用Prepare方法。

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

相关文章: