ExecuteNonQuery需要一个开放且可用的连接。 连接的当前状态已关闭

ExecuteNonQuery需要一个开放且可用的连接。 连接的当前状态已关闭。

我在这做错了什么? 我假设你可以重用连接?

谢谢你的帮助!

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 - "; } 

你的问题是:

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

如果要在“删除”之前再次使用连接,则应该调用cmd.ExecuteReader()' 。 如果你想了解CommandBehaviour.CloseConnection部分的function/意思,那么SqlCommand.ExecuteReader的文档是一个不错的选择。 还有一些文档可以告诉您CommandBehaviour枚举的所有可能值。 基本上CommandBehaviour.CloseConnection执行以下操作:

执行该命令时,关闭关联的DataReader对象时,将关闭关联的Connection对象。

如果您没有特别需要指定CommandBehaviour,则指定CommandBehaviour.Default ,或者根本不指定一个。 CommandBehaviour.Default是:

查询可以返回多个结果集。 执行查询可能会影响数据库状态。 默认设置没有CommandBehavior标志,因此调用ExecuteReader(CommandBehavior.Default)在function上等同于调用ExecuteReader()。

你正在关闭连接rdr.Close(); 并且在调用ExecuteNonQuery()之前永远不要重新打开它。

如果它被包装在一个use中,你实际上根本不需要关闭它,因为对Dispose()的调用会自动为你关闭连接。

在执行ExecuteNonQuery之前,您似乎正在阅读。 在第一次调用SqlCommand(对于SELECT)时,您将在读取完成后关闭连接。

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

删除命令行为,您应该好好去,或者在下一个if语句中重新打开连接。

这个

 SqlDataReader rdr = cmd.ExecuteReader(); 

或这个

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

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

就在这里,您的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(); } 

之后,“设置新的活动并重置其他人”部分将失败,因为连接已关闭。