2010-08-23 38 views
13

ExecuteNonQuery需要一個開放且可用的Connection。連接的當前狀態已關閉。ExecuteNonQuery需要一個開放且可用的Connection。連接的當前狀態已關閉

我在這裏做錯了什麼?我假設你可以重用連接?

感謝您的幫助!

using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString())) 
{ 
    cn.Open(); 

    // If we are reverting to an old type 
    if (pageAction == "revert") 
    { 
     debug.Text = "FLAG 1"; 

     // Get the revert ID 
     int revertingID = int.Parse(Request.QueryString["revID"]); 
     bool rowsReturned = false; 

     debug.Text = "FLAG 2 - " + revertingID.ToString(); 

     // Set all to 0 
     using (SqlCommand cmd = new SqlCommand("SELECT ID FROM tblSiteSettings WHERE ID = " + revertingID, cn)) 
     { 
      // If it exists 
      SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); 
      if (rdr.Read()) 
      { 
       rowsReturned = true; 
      } 
      rdr.Close(); 
     } 

     debug.Text = "FLAG 3 - " + rowsReturned.ToString(); 

     // Set new active and reset others 
     if (rowsReturned == true) 
     { 
      using (SqlCommand cmd = new SqlCommand("UPDATE tblSiteSettings SET isActive = 1 WHERE ID = " + revertingID, cn)) 
      { 
       cmd.ExecuteNonQuery(); 
      } 
      using (SqlCommand cmd = new SqlCommand("UPDATE tblSiteSettings SET isActive = 0 WHERE ID <> " + revertingID, cn)) 
      { 
       cmd.ExecuteNonQuery(); 
      } 
     } 
     //debug.Text = "FLAG 4 - "; 
    } 

回答

16

您的問題是:

SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); 

你應該只調用cmd.ExecuteReader()'如果你要使用「擺脫之前再次連接「它。如果你想了解CommandBehaviour.CloseConnection部件的功能/意味着什麼,那麼SqlCommand.ExecuteReader的文檔是一個不錯的選擇。還有文檔可以告訴你CommandBehaviour enumeration所有可能的值。本質上,CommandBehaviour.CloseConnection執行以下操作:

執行命令時,關聯的DataReader對象關閉時關聯的Connection對象關閉。

如果您沒有特別需要指定CommandBehaviour,則可以指定CommandBehaviour.Default或者根本不指定。 CommandBehaviour.Default是:

該查詢可能會返回多個結果集。執行查詢可能會影響數據庫狀態。默認設置沒有CommandBehavior標誌,因此調用ExecuteReader(CommandBehavior.Default)在功能上等同於調用ExecuteReader()。

+0

使用()語句時,它的命令是否在關閉連接時被封裝,以及它是否處置SqlCommand? – Tommy 2010-08-23 13:52:59

+0

@Tommy,不是我所知 - SqlCommand.Dispose的文檔沒有調用它,所以我會假設不是(http://msdn.microsoft.com/zh-cn/library/system .data.sqlclient.sqlcommand.dispose.aspx) – Rob 2010-08-23 13:58:50

+0

好的調用,如果連接定義被封裝在Using塊中,那麼它會。 http://stackoverflow.com/questions/410222/does-connection-close-when-command-is-disposed-and-the-connection-is-defined-dire – Tommy 2010-08-23 14:06:19

5

你打電話之前ExecuteNonQuery()關閉連接rdr.Close();永不重新打開它。

因爲Dispose()的呼叫會自動關閉連接,所以如果包裝在using中,您實際上並不需要關閉它。

4

看來您在執行ExecuteNonQuery之前正在進行讀取操作。在第一次調用SqlCommand(對於SELECT)時,在讀取完成後關閉連接。

SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); 

刪除命令的行爲,你應該是好去,或重新打開你的下一個if語句的連接。

SqlDataReader rdr = cmd.ExecuteReader(); 

或者這

if (rowsReturned == true){ 
    cn.open(); 
1

就在這裏,您SqlDataReader的完成時將關閉連接:

// Set all to 0 
using (SqlCommand cmd = new SqlCommand("SELECT ID FROM tblSiteSettings WHERE ID = " + revertingID, cn)) 
{ 
    // If it exists 
    SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); 
    if (rdr.Read()) 
    { 
     rowsReturned = true; 
    } 
    rdr.Close(); 
} 

後來,「設置新的活動和復位等」節會失敗,因爲連接被關閉。

2

只需在之前添加cn.Open,或者不要關閉它。

相關問題