Когда SqlCommand закрывается при использовании в другой функции?

У меня есть программа на C #, где я создал другой класс, и все они должны делать вызовы в базу данных. Поэтому я решил создать статический класс, который обрабатывает все вызовы, чтобы очень легко применять далеко идущие изменения. Внутри этого класса у меня есть функции, которые вызывают различные части SqlCommand ( ExecuteReader() и т. Д.). Я, наконец, устал переписывать весь код подключения и абстрагировал его до другой функции, называемой getSqlCommand() которая возвращает только инициализированный SqlCommand который я использовать для выполнения различных команд. Я решил не передавать SqlCommand обратно в другие программы (хотя это общедоступный метод, если он мне нужен), потому что есть некоторая предварительная обработка, если вы это сделаете, прежде чем я верну свои результаты обратно в программу ,

Мой вопрос: если / когда SqlConnection закрывается? Поскольку он возвращается в качестве возвращаемого значения в SqlCommand , будет ли он оставлен открытым? и если да, могу ли я его закрыть? Вот какой-то код (слегка урезанный), чтобы вы могли видеть, что я делаю, заранее!

Функция создания SqlCommand :

 public static SqlCommand GetSqlCommand(string query) { using (SqlConnection dbConnection = new SqlConnection( SQLConn )) { dbConnection.Open(); SqlCommand cmd = new SqlCommand( query, dbConnection ); cmd.CommandTimeout = 0; return cmd; } } 

Пример использования команды в статическом классе:

 public static SqlDataReader executeReader( string query ) { try { return GetSqlCommand(query).ExecuteReader(); } catch (SqlException) { //Notify User and Resolve Error } return null; } 

SqlConnection закрывается, когда вы вызываете Dispose . Выход из блока using делает это. Соединение будет закрыто.

Вот и все. Это не будет волшебным образом оставаться открытым, потому что ADO.NET не знает и не может узнать, что вы вернули объект соединения.

Переместите соединение из метода GetSqlCommand . Передайте объект соединения в этот метод. GetSqlCommand имеет никакого отношения к созданию соединения. Он должен использовать соединение, использовать его, но не закрывать его.

Соединение закрывается до того, как код выходит из метода GetSqlCommand . Это означает, что возвращаемый объект команды бесполезен.

Конструкция using создает блок try ... finally , где он устанавливает соединение в конце блока. Поскольку удаление соединения также закрывает его, соединение уже закрывается до того, как объект команды будет возвращен от метода вызывающему.

Ключевое слово using эквивалентно использованию try finally , и в конечном блоке ваше соединение будет удалено

 SqlConnection dbConnection = new SqlConnection( SQLConn ); try { dbConnection.Open(); SqlCommand cmd = new SqlCommand( query, dbConnection ); cmd.CommandTimeout = 0; return cmd; } catch(Exception ex) { } finally { dbConnection.Dispose(); } 

И даже если в блоке try есть оператор return, блок, наконец , всегда будет выполнен

  • Приложение в клиентской базе данных висит приложение
  • Что может привести к тому, что SqlConnection.Close () займет секунду для выполнения?
  • Тайм-аут соединения SQL Server на VS2017
  • Соединение, использующее invist = false, не закрывается после ручной занесения в распределенную транзакцию
  • ADO.net не закрывает TCP-соединения достаточно быстро
  • SQL CPU High - SqlConnection не закрывается - Связано?
  • Управление подключениями SQL Server
  • Управление подключениями SQL в службе WCF
  • ClassNotFoundException при попытке подключения к SQL Server 2005 с Java
  • SQL Server Azure «Ошибка входа в систему для пользователя»
  • Конструктор SQL-соединения вне оператора using
  • Interesting Posts

    Поиск записей без критериев соответствия

    SQL Server: что такое виртуальный файл журнала?

    SQL В базе данных уже есть объект с именем «#TEMP» после обновления до SAP PL-16

    Просмотр для определения сгруппированных значений или объекта

    Пакетный файл «For / f» дважды дублирует каждую папку и записывает файлы дважды

    Как выбрать следующие верхние строки, включая новые строки, которые Пользователь добавил между выбором.

    Не удалось преобразовать значение параметра из строки в DateTime

    Сохраненные процедуры SQL OUTPUT не работают с ExecuteReader

    Как присоединиться к динамическому оператору sql в переменной с нормальным выражением

    Нужно получить в прошлом месяце только 3 буквы JUL в sql

    SQL выбирает, где столбец начинается с букв

    Отчетная хранимая процедура – Как избежать дублирования?

    T Sql Случай использования в случае, когда предложение where

    Как узнать, существует ли ребенок на любом уровне гнезда в древовидной структуре

    Отображение и объединение таблицы с использованием столбца с нулевыми значениями

    Давайте будем гением компьютера.