Problem polega na tym, że z jakiegoś powodu Twój DataReader nie jest zamykany. Wyjątek? Użytkownik metody nie pamiętał o zamknięciu DataReadera?
Funkcja, która zwraca obiekt DataReader do użycia poza jego treścią, pozostawia odpowiedzialność za zamknięcie go w kodzie zewnętrznym, więc nie ma gwarancji, że czytnik zostanie zamknięty. Jeśli nie zamkniesz czytnika, nie możesz ponownie użyć połączenia, w którym został otwarty.
Więc zwracanie DataReader z funkcji to bardzo zły pomysł!
Możesz zobaczyć całą dyskusję na ten temat tutaj .
Poszukaj zastosowań tej funkcji (GetDataReader
) i sprawdź, czy jest gwarancja, że czytnik się zamyka. A co najważniejsze, nie ma możliwości ponownego wprowadzenia tego kodu i użycia tej samej kolekcji do otwarcia nowego DataReadera przed zamknięciem pierwszego. (Nie daj się zwieść CommandBehavior.CloseConnection. To zajmuje się zamknięciem połączenia tylko wtedy, gdy DataReader jest zamknięty... tylko wtedy, gdy nie omieszkasz go zamknąć)