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?
Odpowiedz
nr
IDataReader
jest prosty do przodu tylko widok wynikowego; nie może się liczyć.
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.
Liczba wierszy obliczana tylko po odczytaniu obiektu DataReader , ale nie udało mi się go odczytać, dlaczego chcesz poznać liczbę wierszy przed jej odczytaniem.
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
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. –
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
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)? –
@sll: odwołanie, które wskażesz, jest już nieaktualne, idź rysunek. – michael
Zaktualizowany link, zobacz [jak uzyskać liczbę wierszy przy użyciu SqlDataReader w C#] (http://stackoverflow.com/q/1383315/485076) – sll