er.shoaib Ответов: 4

Как работает блок "наконец".


Я должен знать, когда, наконец, блок действительно будет выполнен.наконец, блок выполняется после того, как произошло исключение, или будет выполняться нормально?
фрагмент кода:
try
{
   if (txt_password.Text == txt_cpassword.Text)
   {
     con.Open();
     cmd = new SqlCommand("DELETE FROM LoginTB WHERE Username = '" + txt_username.Text + "' AND Password = '" + txt_cpassword.Text + "'", con);
     cmd.ExecuteNonQuery();
     MessageBox.Show("User account Deleted");
   }
    else
      {
       MessageBox.Show("Sorry...Password does not match with confirm password ");
      }
}
catch (Exception)
  {
   MessageBox.Show("Invalid operation");
  }
finally
  {
   con.Close();
  }

Если блок try-catch не дает мне никаких исключений, это означает, что он обычно выполняется до желаемого результата.
если я напишу кон.Close() в finally блок есть близкие отношения или я должен написать кон.Close () в блоке try.

Благодарный вам.

PIEBALDconsult

Я согласен с Роханом и хотел бы добавить, что открытый должен быть вне try/catch. Лучше было бы переместить код доступа к данным в отдельный класс (уровень доступа к данным).

4 Ответов

Рейтинг:
2

Thanks7872

В очень простых выражениях,finally гарантированно выполняется независимо от исключения. Видеть это : try-catch-finally (ссылка на C# )[^]

В нем говорится, что:

Цитата:
Общее использование catch и finally вместе состоит в том, чтобы получать и использовать ресурсы в блоке try, иметь дело с исключительными обстоятельствами в блоке catch и освобождать ресурсы в блоке finally.

Примечание:

Всегда полезно использовать параметризованный запрос. То есть,
DELETE FROM LoginTB WHERE Username = '" + txt_username.Text + "' AND Password = '" + txt_cpassword.Text + "'
следует изменить, чтобы предотвратить атаки SQL-инъекций.

Видеть это : Использование параметризованных запросов для предотвращения атак SQL-инъекций в sql server[^]


RaisKazi

Мои 5! исчерпывающий ответ.

Thanks7872

Спасибо :-)

Sergey Alexandrovich Kryukov

Конечно, 5.
—СА

Thanks7872

Спасибо, Сергей.

Рейтинг:
2

Member 12836013

Выполнение блока finally происходит независимо от того, происходит ли исключение или нет. Он всегда выполняется с последующим блоком try (если исключение не произошло) или с последующим блоком try-catch(если исключение произошло). Наконец, блок всегда используется для размещения кода очистки, такого как закрытие соединений с базой данных, закрытие обработчиков файлов и т. д.


NotPolitcallyCorrect

Почти уверен, что ОП получил эту идею из всех ответов трехлетней давности.

CHill60

Мой совет состоит в том, чтобы (в общем) избегать ответов на вопросы, которым больше, скажем, 6 месяцев. Особенно избегайте отвечать на вопросы, на которые уже есть ответ, особенно если один или несколько ответов были "приняты" или имеют 4 звезды или более среднего рейтинга.
Но самое главное, действительно действительно избегайте просто говорить то же самое, что уже сказал кто-то другой.

Рейтинг:
1

Peter Leow

Эмпирическое правило гласит: "открывай как можно позже. Закройте как можно скорее". Оператор Use "using" гарантирует это.

Взгляните на http://msdn.microsoft.com/en-us/library/vstudio/yh598w02.aspx.

По этой причине я обычно делаю это:

using(MySqlConnection con= new MySqlConnetion(connectionString)
{
кон.открыть();
// выполните запрос к базе данных здесь

} / / con закрывается и утилизируется сразу же после выхода


Здесь есть хороший пример:
http://www.dotnetperls.com/sqlconnection


Sergey Alexandrovich Kryukov

Этот принцип по меньшей мере сомнителен. Я бы сказал, Это зависит от того, что открывать/закрывать...
—СА

Рейтинг:
0

Abhinav S

То finally блок всегда выполняется-независимо от того, есть ли ошибка или нет.


Sergey Alexandrovich Kryukov

Что в нем хорошего — просто к делу, 5.
—СА

Abhinav S

Спасибо.