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 - ";
}
答案 0 :(得分:17)
你的问题是:
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()。
答案 1 :(得分:5)
您正在关闭连接rdr.Close();
,并且在致电ExecuteNonQuery()
之前从未重新打开它。
如果它被using
包裹,你实际上根本不需要关闭它,因为对Dispose()
的调用会自动关闭你的连接。
答案 2 :(得分:4)
在执行ExecuteNonQuery之前,您似乎正在阅读。在第一次调用SqlCommand(对于SELECT)时,您将在读取完成后关闭连接。
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
删除命令行为,你应该好好去,或者在下一个if语句中重新打开连接。
此
SqlDataReader rdr = cmd.ExecuteReader();
或者这个
if (rowsReturned == true){
cn.open();
答案 3 :(得分:2)
只需添加cn.Open
之前或不要关闭它。
答案 4 :(得分: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();
}
稍后,“设置新的活动并重置其他人”部分将失败,因为连接已关闭。