Câteva presupuneri: problemă ar putea fi datorată mecanismului ADO.NET connection pool sau/şi faptului că la unele reader-e rămân înregistrări "neconsumate".
Câteva soluţii:
[1] foloseşte DataSet (care ţine înregistrările în cache în timp ce un DataReader menţine conexiunea cu BD),
[2] la fiecare DataReader apelezi
Cancel înainte de Close
[3] pentru a citi acea singură înregistrare folosind un DataReader foloseşti altă soluţie de implementare. Vezi
aici secţiunea
How to Use Stored Procedure Output Parameters to Retrieve a Single Row.