Moje pytanie brzmi, jak uzyskać liczbę wierszy zwróconych przez zapytanie przy użyciu SqlDataReader
w C #. Widziałem kilka odpowiedzi na ten temat, ale żadna nie została jasno zdefiniowana, z wyjątkiem jednej, która mówi, że należy wykonać pętlę while z Read()
metodą i zwiększyć licznik.
Mój problem polega na tym, że próbuję wypełnić wielowymiarową tablicę, w której pierwszy wiersz jest nazwami nagłówków kolumn, a każdy następny wiersz ma być danymi wiersza.
Wiem, że mogę po prostu zrzucić rzeczy do kontrolki List i nie martwić się o to, ale dla własnego osobistego rozwoju i chciałbym również pobierać dane do iz tablicy, gdy wybieram i wyświetlać je w różnych formatach.
Więc myślę, że nie mogę zrobić, Read()
a następnie zwiększyć ++ sposób, ponieważ oznacza to, że musiałbym otworzyć, Read()
a następnie Read()
ponownie otworzyć, aby uzyskać liczbę wierszy, a następnie dane kolumny.
Tylko mały przykład tego, o czym mówię:
int counter = 0;
while (sqlRead.Read())
{
//get rows
counter++
}
a następnie pętla for przebiegająca przez kolumny i pop
something.Read();
int dbFields = sqlRead.FieldCount;
for (int i = 0; i < dbFields; i++)
{
// do stuff to array
}
źródło
RepeatableRead
Poziom izolacji nie wykonuje zakres blokowania więc nadal pozwala rekordy mają być wstawione, trzeba używać poziom izolowaniaSnapshot
lubSerializable
.Jeśli nie musisz pobierać całego wiersza i chcesz uniknąć podwójnego zapytania, prawdopodobnie możesz spróbować czegoś takiego:
Być może będziesz musiał dodać transakcję, nie mając pewności, czy ponowne użycie tego samego polecenia spowoduje automatyczne dodanie do niej transakcji ...
źródło
sqlCon.Close();
? Pomyślałem, że tousing
powinno zrobić to za Ciebie.Zgodnie z powyższym, zbiór danych lub zbiór danych wpisanych na maszynie może być dobrą tymczasową strukturą, której można użyć do filtrowania. SqlDataReader jest przeznaczony do bardzo szybkiego odczytu danych. Kiedy jesteś w pętli while (), nadal jesteś połączony z bazą danych i czeka, aż zrobisz wszystko, co robisz, aby odczytać / przetworzyć następny wynik, zanim przejdzie dalej. W takim przypadku lepszą wydajność można uzyskać, pobierając wszystkie dane, zamykając połączenie z bazą danych i przetwarzając wyniki „w trybie offline”.
Wydaje się, że ludzie nienawidzą zbiorów danych, więc powyższe można zrobić również z kolekcją silnie wpisanych obiektów.
źródło
Nie można uzyskać liczby wierszy bezpośrednio z czytnika danych, ponieważ jest to tak zwany kursor węża pożarowego - co oznacza, że dane są odczytywane wiersz po wierszu na podstawie wykonywanego odczytu. Odradzałbym wykonywanie 2 odczytów danych, ponieważ istnieje możliwość, że dane uległy zmianie między wykonaniem 2 odczytów, a zatem uzyskasz różne wyniki.
Możesz wczytać dane do tymczasowej struktury i użyć ich zamiast drugiego odczytu. Alternatywnie musisz zmienić mechanizm pobierania danych i zamiast tego użyć czegoś takiego jak DataTable.
źródło
aby uzupełnić odpowiedź Pit i uzyskać lepszą wydajność: uzyskaj wszystko w jednym zapytaniu i użyj metody NextResult.
źródło
Mam również do czynienia z sytuacją, w której musiałem zwrócić najwyższy wynik, ale chciałem również uzyskać łączną liczbę wierszy pasujących do zapytania. ostatecznie dochodzę do tego rozwiązania:
źródło