我有以下代码。SqlDataReader和SqlCommand
using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
connection.Open();
SqlCommand select = new SqlCommand("SELECT RTRIM(LTRIM(PART_NO)) AS PART_NO, record FROM [RMAData].[dbo].[IMPORTING_ORDER_EDI] WHERE sessionID = '" + Session.SessionID + "'", connection);
SqlDataReader reader = select.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
if (!currentPart.IsActive)
{
// this part is not active, set the active flag in sql to 0
SqlCommand update = new SqlCommand("UPDATE [RMAData].[dbo].[IMPORTING_ORDER_EDI] SET valid = 0, active = 0 WHERE record = " + reader["record"].ToString() + ";", connection);
update.ExecuteNonQuery();
}
else
{
///blah
}
}
reader.Close();
}
}
但这会导致以下异常...
System.InvalidOperationException:有已与此命令必须先关闭相关联的打开的DataReader 。
我需要读取返回的每一行,对数据做一些验证并在必要时进行更新,然后继续到下一条记录。如果我在使用reader.Read()
循环时不能使用SqlCommand
,我该如何实现这一目标?
格兰特托马斯的回答是正确的,但它会更有效地记录您希望设置为不活动的每个记录的PK,然后执行单个UPDATE ... WHERE IN(...)读者。 – Phil 2013-02-21 15:36:55
有趣......就像建立一个PK的数组,你的意思是然后循环通过? – Stuart 2013-02-21 15:41:07
为什么你需要选择并循环每个更新?为什么不直接使用select语句的where子句进行更新? – adrianm 2013-02-21 18:19:37