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) は、1 つの接続で複数のバッチを実行できるようにする機能です。以前のバージョンでは、1 つの接続に対して一度に 1 つのバッチしか実行できませんでした。MARS で複数のバッチを実行しても、操作が同時に実行されるわけではありません。

一般的な注意として、IDisposable を実装するものはすべて using ブロックでラップすることをお勧めします。そうすれば、リソースは適切に閉じられ、解放されます。

したがって、接続は次のようにラップできます。

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

SqlCommandあなたとSqlDataReaderオブジェクトについても同様です。

于 2013-03-23T10:02:26.170 に答える