Le type de code que vous écrivez est très sensible à l'injection SQL. Plutôt que de traiter le lecteur comme vous le faites, vous pouvez simplement utiliser la propriété RecordsAffected pour trouver le nombre de lignes dans le lecteur.
MODIFIER :
Après avoir fait quelques recherches, la différence que vous voyez est une différence de conception entre la connexion contextuelle et une connexion régulière. Peter Debetta a blogué à ce sujet et écrit :
"La connexion contextuelle est écrite de telle sorte qu'elle ne récupère qu'une ligne à la fois, donc pour chacune des 20 millions de lignes impaires, le code demandait chaque ligne individuellement. En utilisant une connexion sans contexte, cependant, il demande une valeur de 8K de lignes à la fois."
http://sqlblog.com /blogs/peter_debetta/archive/2006/07/21/context-connection-is-slow.aspx