2013-08-26 30 views
0

長時間以來,我的代碼一直在運行,但最近我遇到了這個錯誤,Object reference not set to an instance of an object.我不知道它是否與創建和使用新數據庫有關。錯誤:未將對象引用設置爲對象的實例/連接未關閉。連接的當前狀態是開放的

這裏是我的代碼:在這一部分

con2.Open(); 
    SqlCommand cmd = new SqlCommand(); 
    cmd.Connection = con; 
    cmd.CommandText = "SELECT QtyInHand FROM Inventory WHERE [email protected]"; 
    cmd.Parameters.Add("@ProductID", SqlDbType.Int).Value = productID; 
    int existingQty = (int)cmd.ExecuteScalar(); 
    cmd.Parameters.Clear(); 
    cmd.CommandText = "UPDATE Inventory SET [email protected] WHERE [email protected]"; 
    cmd.Parameters.Add("@QtyInHand", SqlDbType.Int).Value = existingQty - int.Parse(quantity); 
    cmd.Parameters.Add("@ProductID", SqlDbType.Int).Value = productID; 
    cmd.ExecuteNonQuery(); 
    con2.Close(); 

錯誤:int existingQty = (int)cmd.ExecuteScalar();

當我試圖用我的其他的SqlConnection:精讀

con.Open(); 
    SqlCommand cmd = new SqlCommand(); 
    cmd.Connection = con; 
    cmd.CommandText = "SELECT QtyInHand FROM Inventory WHERE [email protected]"; 
    cmd.Parameters.Add("@ProductID", SqlDbType.Int).Value = productID; 
    int existingQty = (int)cmd.ExecuteScalar(); 
    cmd.Parameters.Clear(); 
    cmd.CommandText = "UPDATE Inventory SET [email protected] WHERE [email protected]"; 
    cmd.Parameters.Add("@QtyInHand", SqlDbType.Int).Value = existingQty - int.Parse(quantity); 
    cmd.Parameters.Add("@ProductID", SqlDbType.Int).Value = productID; 
    cmd.ExecuteNonQuery(); 
    con.Close(); 

我遇到另一個錯誤,The connection was not closed. The connection's current state is open.錯誤的con.Open();部分。我應該如何解決這個問題?

回答

2

對於第一個錯誤,您的executeScalar()調用返回空值。要麼改進您的查詢 - 您可以通過直接在數據庫中運行來檢查查詢 - 或者更改邏輯以處理空值。

對於第二個錯誤,如果調用Open()正在引發該錯誤,這是因爲連接對象之前正在使用且未正確關閉。通常認爲重新使用這樣的連接是不好的做法,所以考慮在打開連接時創建一個新的連接實例。

編輯:我試圖在第二段暗示一些東西,但現在我覺得我必須明確說明:不要忘記處理你在那裏留下的聯繫,因爲它可能是一個主要的表現豬爲您的應用程序。特別是因爲它是一個ASP.NET的。一旦你不需要它們,就立即處理連接。當您撥打Dispose()進行連接時,它會被關閉 - 同時還會增加其他更好的內存管理程序。只要有一段時間,請閱讀using聲明及其與連接的用法。

相關問題