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(); }
之后,“设置新的活动并重置其他人”部分将失败,因为连接已关闭。