我有这个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
,我该怎么做?
答案 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方法。
如果可能,最好使用存储过程。