Io modificherei il codice per renderlo più strutturato, poiché sospetto che vi siano aperture/chiusure di connessioni inattese a seconda del "giro" che fa il codice.
Io adotterei una struttura di questo tipo:
codice:
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
using (var command = new SqlCommand(commandText, connection))
{
// ...
}
}
In questo modo, le risorse vengono inizializzate/finalizzate nella sequenza ritenuta consona ed è possibile riprodurle senza che l'eventuale intervento del GC possa influire.
Poi ne riparliamo. 
Ciao!