2010-08-23 37 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,或者不要关闭它。

相关问题