我很想跟踪可能出现错误的地方。每次我都会点击“接收”按钮。它给我一个异常错误,说
连接未关闭。连接的当前状态是 开。
这是
背后的代码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()
答案 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重载来指定参数类型及其大小。