2011-07-18 13 views
6

Czy istnieje sposób na uzyskanie całkowitej liczby wierszy zwróconych przez zapytanie SQL (z obiektu IDataReader) przed wykonaniem iteracji w wierszach za pomocą reader.Read();?IDataReader - Jakikolwiek sposób na uzyskanie całkowitych wierszy?

+0

@sll: odwołanie, które wskażesz, jest już nieaktualne, idź rysunek. – michael

+0

Zaktualizowany link, zobacz [jak uzyskać liczbę wierszy przy użyciu SqlDataReader w C#] (http://stackoverflow.com/q/1383315/485076) – sll

Odpowiedz

9

nr

IDataReader jest prosty do przodu tylko widok wynikowego; nie może się liczyć.

3

Nie, datareader nie zwróci najpierw liczby. Jeśli jednak potrzebujesz tego, użyj dwóch zapytań, które zwracają wiele zestawów wyników.

na przykład w SQL Server:

sql = "SELECT COUNT (*) z A; select * from A;"

iteracyjne zestawów wyników. Użyj datareader na drugim zestawie wyników.

Serwer bazy danych powinien być w stanie wykonać to dość szybko, jeśli używa odpowiednich indeksów.

0

Liczba wierszy obliczana tylko po odczytaniu obiektu DataReader , ale nie udało mi się go odczytać, dlaczego chcesz poznać liczbę wierszy przed jej odczytaniem.

+0

Aby przydzielić dokładnie idealną ilość miejsca do przechowywania niezbędnego do przechowywania kopii całego wyniku set (zamiast, na przykład, pozwalając [List (T) .Add()] (http://msdn.microsoft.com/en-us/library/3wcytfd1) automatycznie zwiększyć jego [Pojemność] (http: // msdn .microsoft.com/en-us/library/y52x03h2) często). – binki

+0

To jest najbardziej oczywiste, które miałem na myśli. Innym przypadkiem użycia byłoby zaktualizowanie określonego paska postępu podczas odczytywania wierszy. Kolejna MIGA może być wprowadzana do heurystyki w celu przetwarzania wierszy (np. Możesz przetworzyć 100 wierszy w inny sposób niż przetwarzanie 10 milionów wierszy, a przełączenie w trakcie może być bolesne). Prawdopodobnie tony innych uzasadnionych powodów. –

3

Znacznie poza datą wysłania, ale jest sposób, który zadziałał dla mnie, zabrało mi trochę czasu, ponieważ wysysam treść moich wyszukiwań w Google.

dbCommand.Connection.Open(); 
//dbReader = dbCommand.ExecuteReader(); I left this here to show not to do the read 

searchCount = dbCommand.ExecuteScalar(); // this line returns the value count 
             // from my tests on my reader it works perfectly 
+0

Czy nie wymagałoby to dwóch oddzielnych egzekucji, co oznacza, że ​​może być podatne na warunki wyścigu, jeśli ktoś zmieni coś pomiędzy wywołaniem ExecuteScalar() (aby uzyskać licznik) i wywołaniem ExecuteReader() (aby uzyskać same wiersze)? –

Powiązane problemy