Rey*_*nan 1 c# sql-server asp.net
我收到一个错误:
已经有一个与此命令关联的打开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();
Run Code Online (Sandbox Code Playgroud)
我需要在内部执行更新和删除while(dr.read())但是当我尝试关闭连接然后再次打开时会弹出该错误,而while将停止并且将出现错误,它表示ExecuteReader已关闭.请帮我.
如果将其添加到连接字符串,它将允许该代码工作:
MultipleActiveResultSets=True;
Run Code Online (Sandbox Code Playgroud)
来自文档:
多个活动结果集(MARS)是一种允许在单个连接上执行多个批处理的功能.在以前的版本中,一次只能对一个连接执行一个批处理.使用MARS执行多个批次并不意味着同时执行操作.
正如一般说明 - 最好将实现IDisposable的任何东西包装在using块中.这样资源将被正确关闭并释放.
所以你的连接可以包装如下:
using (var con = new SqlConnection(connectionString))
{
...
}
Run Code Online (Sandbox Code Playgroud)
与您SqlCommand和SqlDataReader对象类似.
| 归档时间: |
|
| 查看次数: |
5386 次 |
| 最近记录: |