Subito prima di usare executereader prova a mettere:
msgbox cstr(Conn.State)
e vedi cosa ti restituisce. Se restituisce 1 vuol dire che è aperta. Nel caso in cui sia chiusa devi vedere dov'è che si chiude a tua insaputa.
Potresti anche fare un controllo sullo stato della connessione prima di usare executeReader con un if del genere:
codice:
if conn.State <> 1
...
     conn.open
...
end if
Prova