连接状态未关闭

时间:2015-10-28 08:46:47

标签: c# asp.net

我很想跟踪可能出现错误的地方。每次我都会点击“接收”按钮。它给我一个异常错误,说

  

连接未关闭。连接的当前状态是   开。

这是

背后的代码
void GetReceiptNo(int ID)
{
    con.Open();
    SqlCommand cmd = new SqlCommand();
    //cmd.Connection = con;
    cmd.Connection.Open();
    cmd.CommandText = "SELECT ReceiptNo FROM PurchaseOrder WHERE PONo=@PONo";
    cmd.Parameters.AddWithValue("@PONo", ID);
    SqlDataReader dr = cmd.ExecuteReader();
    if (dr.HasRows)
    {
        while (dr.Read())
        {
            txtReceiptNo.Text = dr["ReceiptNo"].ToString();

        }
    }
    else
    {
        con.Close();
        Response.Redirect("~/PurchaseOrder/MaterialsReceive.aspx");
    }
    if (cmd.Connection.State == ConnectionState.Open)
    {
        cmd.Connection.Close();
    }
}

void UpdateInventory(string itemID, string quantity)
{

    con.Open();
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = con;
    cmd.CommandText = "INSERT INTO Receiving VALUES (@ItemNo, @Quantity, @Timestamp); " +
        "UPDATE RMInventory SET Available = Available + @Quantity WHERE ItemNo=@ItemNo; " +
        "UPDATE PODetails SET Status = 'Received' WHERE PONo=@PONo AND Status='Process' " +
        "UPDATE PurchaseOrder SET Status = 'Received' WHERE PONo=@PONo AND Status='Processing' " +
        "UPDATE PurchaseOrder SET DateReceived=@DateReceived WHERE PONo=@PONo";
    cmd.Parameters.AddWithValue("@PONo", Request.QueryString["ID"].ToString());
    cmd.Parameters.AddWithValue("@ItemNo", itemID);
    cmd.Parameters.AddWithValue("@Quantity", quantity);
    cmd.Parameters.AddWithValue("@Timestamp", DateTime.Now);
    cmd.Parameters.AddWithValue("@DateReceived", DateTime.Now);
    cmd.ExecuteNonQuery();
    con.Close();
}

该错误将出现在void UpdateInventory上 con.Open()

2 个答案:

答案 0 :(得分:2)

在处理连接时尝试使用using语句。它将帮助您处理这些情况。

using(var con = new SqlConnection(connectionString))
using(var cmd = new SqlCommand(query, con))
{
    con.Open();
    //your code
} 

如果您没有使用using语句(理想情况下推荐的 ),那么您可以将代码置于try catch中并最终阻止并尝试关闭内部的连接最后像这样阻止:

try   
{   
   con.Open();   
   SqlCommand cmd = new SqlCommand(query, con);   

   cmd.ExecuteNonQuery();    
   con.Close();    
 }    
 catch (Exception ex)
 {
 }
 finally
 {
    con.close();
 }

答案 1 :(得分:1)

在代码中完成后,您应该立即始终关闭con连接。听起来好像你试图打开已经打开的连接。

using statement是最好的方法。

using(var con = new SqlConnection(conString))
using(var cmd = con.CreateCommand())
{
   // Define your CommandText
   // Add your parameters
   // Execute your query
}

您甚至可以将它与阅读器一起使用。也不要使用AddWithValue方法。 It may generate unexpected and surprising results sometimes。使用Add method重载来指定参数类型及其大小。