";已经有一个打开的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
,如何做到这一点?
在读卡器中仍在使用同一连接时,您正在重用该连接。尝试在此处打开新连接
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方法。
如果可能的话,最好使用存储过程。