Что происходит с открытым соединением с базой данных?

недопустимое новое выражение абстрактного типа класса 'box'

В сообщении об ошибке нет ничего неясного. В вашем классе box есть хотя бы один не реализованный член, что означает, что он абстрактный. Вы не можете создать экземпляр абстрактного класса.

Если это ошибка, исправьте свой класс box, реализовав отсутствующий член (ы).

Если это умышленно, унаследовать от блока, реализовать недостающий элемент (ы) и использовать производный класс.

7
задан agnieszka 19 June 2009 в 15:28
поделиться

4 ответа

Соединение будет закрыто при выходе из приложения. Прочтите Завершение SqlConnection . Из документации MSDN для Object.Finalize :

«Во время завершения работы домена приложения Finalize автоматически вызывается для объектов, которые не освобождены от финализации, даже тех, которые все еще доступны».

4
ответ дан 7 December 2019 в 05:27
поделиться

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

// this using block will auto close & dispose your connection...
using (var conn = new SqlConnection(...))
{
    conn.Open();
    // database code here with no explicit close

}

это функциональный эквивалент блока try / finally с conn.close в finally. Многие разработчики упускают из виду блоки using - убедитесь, что вы не делаете то же самое в этом случае.

Если вы действительно переписываете свой код, чтобы закрыть соединения - рекомендуется использовать блоки Using вокруг всех объектов вашей базы данных (соединение, command, reader), чтобы убедиться, что они закрываются и удаляются, когда они выпадают из области использования блока. Я определенно предлагаю записать их в свой код, а не просто conn.Close () там, где это необходимо.

2
ответ дан 7 December 2019 в 05:27
поделиться

Создание соединений SQL требует больших затрат, и в ADO.NET используется метод, называемый пулом соединений, который позволяет использовать их повторно.

Цитата из MSDN :

Настоятельно рекомендуется всегда закрывайте соединение, когда вы закончили использовать его, чтобы он быть возвращенным в пул соединений и можно использовать повторно.

Если максимальный размер пула был достигнуто и нет доступного соединения доступен, запрос поставлен в очередь. В затем пулер пытается вернуть все подключений до истечения тайм-аута достигнут (по умолчанию 15 секунд). Если пуллер не может удовлетворить запрос до времени подключения out, генерируется исключение.

1
ответ дан 7 December 2019 в 05:27
поделиться

Я ожидаю, что при выходе из приложения в обычном режиме запустятся финализаторы. Они закроют соединение, если оно все еще открыто. Только не полагайтесь на это: может пройти некоторое время, прежде чем эти финализаторы запустятся в нормальном режиме работы вашего приложения, поэтому вы будете держать слишком много соединений открытыми.

Когда приложение выйдет из строя, возможно, финализатор не запустится, оставляя соединение открытым по истечении срока службы приложения.

1
ответ дан 7 December 2019 в 05:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: