Первый вопрос:
скажи, что у меня есть
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
string storedProc = "GetData";
SqlCommand command = new SqlCommand(storedProc, connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(new SqlParameter("@EmployeeID", employeeID));
return (byte[])command.ExecuteScalar();
}
Соединение закрывается? Потому что технически мы никогда не добираемся до последнего, }
как return
раньше.
Второй вопрос: на
этот раз у меня есть:
try
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
int employeeID = findEmployeeID();
connection.Open();
SqlCommand command = new SqlCommand("UpdateEmployeeTable", connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(new SqlParameter("@EmployeeID", employeeID));
command.CommandTimeout = 5;
command.ExecuteNonQuery();
}
}
catch (Exception) { /*Handle error*/ }
Теперь, скажем где-нибудь в, try
мы получаем ошибку, и она ловится. Соединение все еще закрывается? Потому что, опять же, мы пропускаем оставшуюся часть кода try
и переходим непосредственно к catch
выражению.
Я слишком линейно думаю о том, как using
работает? т.е. Dispose()
просто вызывается, когда мы покидаем using
сферу?
источник
try catch
внутриusing
вы можете явно.Commit
или.Rollback
транзакции вcatch
. Это и более читабельно, и явно, и позволяет вам фиксировать, если это имеет смысл, учитывая тип исключения. (Транзакции неявно откатываются,conn.Close
если не зафиксированы.).Open
связь.using
только гарантирует, что метод объектаDispose
вызывается.Да, на оба вопроса. Оператор using компилируется в блок try / finally
такой же как
Изменить: Исправление приведение к одноразовым http://msdn.microsoft.com/en-us/library/yh598w02.aspx
источник
Вот мой шаблон. Все, что вам нужно, чтобы выбрать данные с сервера SQL. Соединение закрыто и удалено, и ошибки в соединении и выполнении обнаружены.
* Пересмотрено: 2015-11-09 *
По предложению NickG; Если вас раздражает слишком много скобок, отформатируйте их так ...
Опять же, если вы работаете в играх EA или DayBreak, вы можете просто отказаться от любых разрывов строк, потому что они предназначены только для людей, которые должны вернуться и посмотреть на ваш код позже, и кого это волнует? Я прав? Я имею в виду 1 строку вместо 23 означает, что я лучший программист, верно?
Фу ... ОК. Я вытащил это из своей системы и немного позабавился. Продолжать.
источник
conn.Close();
в конце? Развеusing
заявление не делает это для вас через утилизацию?Dispose просто вызывается, когда вы выходите из области использования. Намерение «использовать» состоит в том, чтобы предоставить разработчикам гарантированный способ обеспечить утилизацию ресурсов.
Из MSDN :
источник
Using
генерирует попытку / окончание вокруг объекта, который выделяется, и вызываетDispose()
вас.Это избавляет вас от необходимости вручную создавать блок try / finally и вызывать
Dispose()
источник
В вашем первом примере компилятор C # фактически преобразует оператор using в следующее:
Наконец, операторы всегда будут вызываться до того, как функция вернется, и поэтому соединение всегда будет закрыто / удалено.
Итак, во втором примере код будет скомпилирован в следующее:
Исключение будет зафиксировано в операторе finally, и соединение будет закрыто. Исключение не будет видно во внешнем предложении catch.
источник
Я написал два оператора using внутри блока try / catch, и я увидел, что исключение перехватывалось таким же образом, если оно помещалось во внутренний оператор using, как в примере с ShaneLS .
Независимо от того, где размещена попытка / отлов , исключение будет поймано без проблем.
источник