Преимущества «использования» блока для инициализации SqlCommand
Я понимаю концепцию using
блока block при подключении к серверу sql из вашего приложения, так как он закроет соединение, как только оно выйдет из области действия, и сэкономит нам время на запись блоков try catch finally
.
Но мой вопрос: есть ли преимущества using
при инициализации SqlCommand
как правило, я бы сделал что-то вроде:
string cs = ConfigurationManager.ConnectionStrings["CS1"].ConnectionString; using(SqlConnection con = new SqlConnection(cs)) { SqlCommand cmd = new SqlCommand("SELECT * FROM dbo.City", con); con.Open(); DropDownList1.DataSource = cmd.ExecuteReader(); DropDownList1.DataTextField = "City"; DropDownList1.DataValueField = "ID"; DropDownList1.DataBind(); }
Но какие возможные преимущества я могу получить, поместив инициализацию SqlCommand в block
использования?
- Преобразование даты в тики в SQL Server
- Выберите значение свойства определенного профиля членства с помощью SQL-запроса
- Как интегрировать открытый идентификатор входа в систему
- Отображение нескольких изображений в одной ячейке шаблона данных
- Сохранять значение в переменной после использования оператора select
string cs = ConfigurationManager.ConnectionStrings["CS1"].ConnectionString; using(SqlConnection con = new SqlConnection(cs)) { using(SqlCommand cmd = new SqlCommand("SELECT * FROM dbo.City", con)) { con.Open(); DropDownList1.DataSource = cmd.ExecuteReader(); DropDownList1.DataTextField = "City"; DropDownList1.DataValueField = "ID"; DropDownList1.DataBind(); } }
Весь материал, который я искал в Интернете, говорит о закрытии соединения, как только он выходит из области видимости. Да, я понимаю, что, но включение SqlCommand в использование блока сделает его более эффективным или нет?
Любые советы или указатели очень благодарны вам.
- Добавить столбец в таблице с идентификатором ASP.NET
- Отображение строк выбранных столбцов с помощью элемента управления checkboxlist
- Схема безопасности ASP.NET MVC 4 с моими собственными таблицами и столбцами базы данных
- Razor C # - Получить данные из базы данных
- Размер столбца SQL Server 2008
- Сохраненная процедура с ASP.NET. Слишком много аргументов указала ошибку
- Перенос больших наборов данных - SQL Server (лучшая практика)
- Шифрование строк подключения к аутентификации Windows
Вы можете это четко видеть, глядя на исходный код.
Это реализация SqlCommand.Dispose
:
override protected void Dispose(bool disposing) { if (disposing) { _cachedMetaData = null; } base.Dispose(disposing); }
Как вы можете видеть, это мало что делает. Но, глядя на base.Dispose
:
public void Dispose() { Dispose(true); GC.SuppressFinalize(this); }
SqlCommand
наследует от DbCommand
, который, в свою очередь, наследует от Component
. Component
реализует финализатор , что означает, что объект не будет удален, как только никто не ссылается на него, поскольку он все еще имеет ссылку на очередь финализатора .
Когда вы завершаете SqlCommand
с using
оператора using
, самая важная его часть состоит в том, что его базовый класс (компонент) вызывает GC.SupressFinialize
, который удаляет ссылку на очередь финализатора и позволяет собирать объект после того, как GC запускается.
Вот почему SqlCommand
реализует IDisposable
и должен быть удален.