Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在while(dr.read())中运行SqlCommand_C#_Asp.net_Sql Server - Fatal编程技术网

C# 如何在while(dr.read())中运行SqlCommand

C# 如何在while(dr.read())中运行SqlCommand,c#,asp.net,sql-server,C#,Asp.net,Sql Server,我得到一个错误: 已存在与此命令关联的打开的DataReader,必须先关闭该命令 我的代码: SqlCommand cmd = new SqlCommand("SELECT * FROM shoppingcart", con); SqlDataReader dr; con.Open(); dr = cmd.ExecuteReader(); while (dr.Read()) { found = true; productdat

我得到一个错误:

已存在与此命令关联的打开的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();
SqlCommand cmd=newsqlcommand(“从shoppingcart中选择*”,con);
SqlDataReader-dr;
con.Open();
dr=cmd.ExecuteReader();
while(dr.Read())
{
发现=真;
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=转换为NT32(dr.GetValue(3));
int productID=Convert.ToInt32(dr.GetValue(2));
int cartID=Convert.ToInt32(dr.GetValue(0));
如果(生产日期<以前)
{
SqlCommand updateproducts=newsqlcommand(“更新产品集ProductQuantity=ProductQuantity+@ProductQuantity其中ProductID=@ProductID”,con);
updateproducts.Parameters.AddWithValue(“@ProductQuantity”,ProductQuantity);
updateproducts.Parameters.AddWithValue(“@ProductID”,ProductID);
updateproducts.ExecuteOnQuery();
SqlCommand deletecart=新的SqlCommand(“从shoppingcart中删除,其中ID=@ID”,con);
deletecart.Parameters.AddWithValue(“@ID”,cartID);
deletecart.ExecuteOnQuery();
}
}
con.Close();

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

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

MultipleActiveResultSets=True;
从:

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

正如一般注意事项一样,最好将实现IDisposable的任何东西包装到using块中。这样,资源将被适当地关闭和释放

因此,您可以将连接包装为:

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

与您的
SqlCommand
SqlDataReader
对象类似。

非常感谢您,我已经为此工作了一个小时,这就是我所需要的。非常感谢:DNo problem@ReynanCapco,请确保将您的答案标记为已回答。