2009-09-05 11 views
20

Myślałem, że SQLDataReader nie powinien działać, jeśli nie ma połączenia z SQLServer.Jak działa DataReader?

Eksperymentowałem z tym scenariuszem. Wykonuję ExecuteReader, a następnie zatrzymuję usługę SQLServer i próbuję iterować przez obiekt DataReader. To, czego się spodziewałem, było wyjątkiem, ale dało wyniki jeden po drugim. Idealnie DataReader powinien odczytywać jeden wiersz na raz ze strumienia, który łączy się z serwerem bazy danych, i który powinien rzucić wyjątek, jeśli odłączymy serwer DB?

Nie wiem, czego tu mi brakuje.

+3

Dobry eksperyment! – smwikipedia

Odpowiedz

25

Podejrzewam, że czytelnik czyta partię wyników na raz. Jest to o wiele bardziej wydajne niż jeden wiersz na raz (pomyśl o sytuacji, w której pojedynczy wiersz to tylko kilka bajtów ... nie potrzebujesz pakietu sieciowego dla każdego wiersza, gdy mógł on pobrać wiele wierszy w jednym pakiecie). Potencjalnie pozwala również na wczesne uwolnienie zasobów wewnętrznych bazy danych - jeśli czytnik danych odczyta wszystkie wyniki (jeśli jest ich tylko kilka), może skutecznie zapomnieć o zapytaniu.

Podejrzewam, że jeśli spróbujesz tego samego typu z zapytaniem zwracającym wiele wyników, otrzymasz oczekiwany wyjątek.

+5

Popraw (http://msdn.microsoft.com/en-us/library/ms187602.aspx), wyniki są wysyłane do klienta tak szybko, jak to możliwe, co spowoduje nasycenie bufora sieci przychodzącej dla otwartego połączenia serwer. Jeśli nie pobierzesz więcej danych niż ten bufor pomieści, będziesz w stanie odzyskać wszystkie wiersze w wyniku. –

+0

Dobre wyjaśnienie! – smwikipedia

+0

co to jest bufor sieciowy? wyjaśnij plzz. – Mou

4

Typ połączenia może mieć wpływ na ilość dostarczanych danych w tym samym czasie. W przypadku niewielkiej ilości danych przy użyciu złącza pamięci współużytkowanej jest całkiem możliwe, że wszystkie dane są wysyłane razem.

Pamięć współdzielona to domyślny protokół, gdy klient i serwer znajdują się na tym samym komputerze.

3

Czyta je tak, jak ma czas w tle. Zanim poszedłeś na SQL Server i zamknąłeś połączenie, wszystkie dane zostały przeniesione w tle. Co się stanie, gdy uruchomisz czytnik, jest to, że wywołuje SQL Server i mówi mu, aby zaczął wysyłać wyniki. Jak tylko zapytanie zostanie wykonane, wykonywanie (poprawnie analizowane zapytanie jest poprawne), ale przed zakończeniem działania zwraca. W tym momencie możesz zacząć wywoływać metodę odczytu. Jednak wciąż odczytuje i buforuje dane w tle, aby po ponownym wywołaniu czytać następny wiersz był gotowy, czekając w buforze i nie musi iść do bazy danych.

6

Czytnik danych odczytuje rekord na raz, ale odczytuje go z podstawowego sterownika bazy danych. Sterownik bazy danych odczytuje dane z bazy danych w blokach, zwykle za pomocą bufora o wielkości 8 kilobajtów.

Jeśli twoje wyniki są małe i nie dostaniesz ich zbyt wielu, wszystkie będą pasować do bufora, a sterownik bazy danych będzie mógł je wszystkie przekazać do czytnika danych bez konieczności zadawania bazy danych więcej dane.

Jeśli uzyskasz wynik większy niż bufor, będziesz w stanie odczytać tylko pierwszą jego część, zanim sterownik bazy danych będzie musiał poprosić bazę danych o więcej danych. W tym czasie otrzymasz wyjątek, jeśli baza danych nie będzie już dostępna.

Powiązane problemy