Для 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 - ";
}
Ответы
Ответ 1
Ваша проблема:
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
Вам нужно просто позвонить cmd.ExecuteReader()'
, если вы хотите использовать соединение еще до того, как "избавиться" от него. Если вы хотите понять, что делает CommandBehaviour.CloseConnection
часть/означает, то хорошая документация для SqlCommand.ExecuteReader. Там также документация, чтобы рассказать вам, какие все возможные значения перечисление CommandBehaviour. По существу CommandBehaviour.CloseConnection
выполняет следующие действия:
Когда команда выполняется, связанный объект Connection закрывается, когда связанный объект DataReader закрыт.
Если у вас нет особой необходимости указывать CommandBehaviour, укажите либо CommandBehaviour.Default
, либо не укажете его вообще. CommandBehaviour.Default:
Запрос может возвращать несколько наборов результатов. Выполнение запроса может повлиять на состояние базы данных. По умолчанию не заданы флаги CommandBehavior, поэтому вызов ExecuteReader (CommandBehavior.Default) функционально эквивалентен вызову ExecuteReader().
Ответ 2
Вы закрываете соединение rdr.Close();
и никогда не открываете его перед вызовом ExecuteNonQuery()
.
Вам вообще не нужно закрывать его, если он завернут в using
, поскольку вызов Dispose()
автоматически закроет соединение для вас.
Ответ 3
Кажется, что вы читаете перед выполнением ExecuteNonQuery. При первом вызове SqlCommand (для SELECT) вы закрываете соединение после завершения чтения.
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
Извлеките поведение команды, вам должно быть хорошо идти или повторно открыть соединение в следующем операторе if.
Это
SqlDataReader rdr = cmd.ExecuteReader();
Или это
if (rowsReturned == true){
cn.open();
Ответ 4
Прямо здесь ваш 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();
}
Позднее раздел "Установить новый активный и reset другие" завершится неудачно, поскольку соединение закрыто.
Ответ 5
Просто добавьте cn.Open
раньше или не закрывайте его.