2

我收到一个错误:

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

我的代码:

SqlCommand cmd = new SqlCommand("SELECT * FROM shoppingcart", con);
SqlDataReader dr;
con.Open();

dr = cmd.ExecuteReader();

while (dr.Read())
{
                found = true;
                productdate = Convert.ToDateTime(dr.GetString(4));
                string ago1 = string.Format("{0:MM/dd/yy}", Convert.ToString(productdate));
                string productdate1 = string.Format("{0:MM/dd/yy}", Convert.ToString(ago));
                int productqty = Convert.ToInt32( dr.GetValue(3));
                int productID = Convert.ToInt32(dr.GetValue(2));
                int cartID = Convert.ToInt32(dr.GetValue(0));
                if (productdate < ago)
                {

                    SqlCommand updateproducts = new SqlCommand("UPDATE products SET ProductQuantity=ProductQuantity+@ProductQuantity WHERE ProductID=@ProductID", con);
                    updateproducts.Parameters.AddWithValue("@ProductQuantity", productqty);
                    updateproducts.Parameters.AddWithValue("@ProductID", productID);
                    updateproducts.ExecuteNonQuery();

                    SqlCommand deletecart = new SqlCommand("DELETE FROM shoppingcart WHERE ID=@ID", con);
                    deletecart.Parameters.AddWithValue("@ID", cartID);
                    deletecart.ExecuteNonQuery();
                }
}
con.Close();

我需要在内部执行更新和删除,while(dr.read())但是当我尝试关闭连接然后再次打开时会弹出错误,此时将停止并且会出现错误,表示ExecuteReader已关闭。请帮我。

4

1 回答 1

6

如果将其添加到连接字符串中,它将允许该代码工作:

MultipleActiveResultSets=True;

文档

多个活动结果集 (MARS) 是一项允许在单个连接上执行多个批处理的功能。在以前的版本中,一次只能针对单个连接执行一个批处理。使用 MARS 执行多个批次并不意味着同时执行操作。

就像一般说明一样 - 将实现 IDisposable 的任何内容包装在 using 块中是更好的做法。这样,资源将被正确关闭和释放。

所以你的连接可以像这样包装:

using (var con = new SqlConnection(connectionString))
{
...
}

SqlCommand与您的和SqlDataReader对象类似。

于 2013-03-23T10:02:26.170 回答