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!