Вообще говоря, вы должны закрывать каждое соединение, которое открываете сами. Сборка мусора не даст вам никаких гарантий о том, когда это произойдет. Скорее всего, у вас возникнут утечки, и вы заблокируете выполнение запросов в будущем.
С MSDN :
Сборка мусора происходит, когда одно из следующих условий
правда:
В системе недостаточно физической памяти.
Память, которая используется выделенными объектами в управляемой куче
превосходит приемлемый порог. Это означает, что порог
допустимое использование памяти было превышено в управляемой куче. это
порог непрерывно регулируется в процессе работы.
Вызывается метод GC.Collect. Почти во всех случаях у вас нет
чтобы вызвать этот метод, потому что сборщик мусора работает непрерывно.
Этот метод в основном используется для уникальных ситуаций и тестирования.
Если вы вызываете cn.close, вам следует использовать блок try catch finally, чтобы убедиться, что соединение всегда закрывается даже при исключении.