Подтвердить что ты не робот

SqlCommand с использованием оператора

Я видел, что в большинстве образцов SqlCommand использовался как этот

using (SqlConnection con = new SqlConnection(CNN_STRING))
{
    using (SqlCommand cmd = new SqlCommand("Select ID,Name From Person", con))
    {
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        da.Fill(ds);           
        return ds;
    }
}

Я знаю, почему мы используем оператор "using". Но SqlCommand не использует метод Close(), поэтому мы действительно должны использовать его в инструкции using

4b9b3361

Ответ 1

Потому что он также реализует IDisposable.

Цель использования оператора состоит в том, что когда управление достигнет конца использования, оно будет уничтожать этот объект использования блока и освободить память. его цель заключается не только в закрытии автоматического соединения, но и в том, что он будет использовать объект соединения и, очевидно, соединение также закрыто из-за него.

Его цель - освободить ресурсы, которые мы использовали внутри оператора Using.

Согласно MSDN:

Как правило, когда вы используете объект IDisposable, вы должны объявить его и создать его в операторе using. Оператор using вызывает метод Dispose на объекте правильным образом и (когда вы используете его, как показано выше), он также приводит к тому, что сам объект выходит из области действия, как только вызывается Dispose. Внутри используемого блока объект доступен только для чтения и не может быть изменен или переназначен.

Оператор using гарантирует, что Dispose вызывается, даже если возникает исключение, когда вы вызываете методы на объекте. Вы можете добиться того же результата, поставив объект внутри блока try и затем вызывая Dispose в блоке finally; Фактически, это то, как оператор using преобразуется компилятором. Пример кода ранее расширяется до следующего кода во время компиляции (обратите внимание на дополнительные фигурные скобки для создания ограниченной области для объекта):

ЗАМЕТКА:

Вы можете создать экземпляр объекта ресурса, а затем передать переменную в оператор using, но это не лучшая практика. В этом случае объект остается в области действия после того, как элемент управления покидает блок использования, даже если он, вероятно, больше не будет иметь доступа к своим неуправляемым ресурсам. Другими словами, он больше не будет полностью инициализирован. Если вы попытаетесь использовать объект вне блока использования, вы рискуете вызвать исключение. По этой причине, как правило, лучше создавать экземпляр объекта в инструкции using и ограничивать его область применения блоком использования.

Ответ 2

SqlCommand реализует IDisposable, который оператор using вызывает .Dispose() до того, как будет выполнен блок использования. Я не уверен, что делает SqlCommand.Dispose(), но это хорошая идея, чтобы вызвать .Dispose() в экземпляре, который вы закончили, то есть, возможно, очистит соединение с базой данных.