Jakie są różnice między używaniem SqlDataAdapter a SqlDataReader do pobierania danych z bazy danych?
W szczególności patrzę na ich zalety i wady, a także ich szybkość i wydajność pamięci.
Dzięki
Odpowiedzi:
Z drugiej strony:
Kosztem:
Tak naprawdę zależy to od tego, co robisz, ale wolę czytnik DataReader, dopóki nie potrzebuję czegoś, co jest obsługiwane tylko przez zestaw danych. SqlDataReader jest idealny dla typowego przypadku dostępu do danych, wiążącego się z siatką tylko do odczytu.
Więcej informacji można znaleźć w oficjalnej dokumentacji firmy Microsoft .
while (reader.Read())pętli.
Odpowiedź na to pytanie może być dość szeroka.
Zasadniczo główną różnicą dla mnie, która zwykle wpływa na moje decyzje dotyczące używania, jest to, że w przypadku SQLDataReader dane są „przesyłane strumieniowo” z bazy danych. Z SQLDataAdapter wyodrębniasz dane z bazy danych do obiektu, który może być dalej odpytywany, a także wykonywać operacje CRUD.
Oczywiście ze strumieniem danych SQLDataReader jest DUŻO szybszy, ale jednocześnie można przetwarzać tylko jeden rekord. Dzięki SQLDataAdapter masz pełną kolekcję pasujących wierszy do zapytania z bazy danych w celu pracy z / przejścia przez kod.
OSTRZEŻENIE: Jeśli używasz SQLDataReader, ZAWSZE, ZAWSZE, ZAWSZE upewnij się, że piszesz odpowiedni kod, aby zamknąć połączenie, ponieważ utrzymujesz otwarte połączenie z SQLDataReader. Zaniechanie tego lub prawidłowa obsługa błędów w celu zamknięcia połączenia w przypadku błędu w przetwarzaniu wyników spowoduje USZKODZENIE aplikacji z powodu wycieków połączenia.
Przepraszam, mój VB, ale jest to minimalna ilość kodu, którą powinieneś mieć podczas korzystania z SqlDataReader:
Using cn As New SqlConnection("..."), _
cmd As New SqlCommand("...", cn)
cn.Open()
Using rdr As SqlDataReader = cmd.ExecuteReader()
While rdr.Read()
''# ...
End While
End Using
End Using
odpowiednik C #:
using (var cn = new SqlConnection("..."))
using (var cmd = new SqlCommand("..."))
{
cn.Open();
using(var rdr = cmd.ExecuteReader())
{
while(rdr.Read())
{
//...
}
}
}
SqlDataAdapter jest zwykle używany do wypełnienia DataSet lub DataTable, dzięki czemu będziesz mieć dostęp do danych po zamknięciu połączenia (rozłączeniu dostępu).
SqlDataReader to połączony kursor tylko do szybkiego przewijania do przodu, który zwykle jest szybszy niż wypełnianie DataSet / DataTable.
Co więcej, dzięki SqlDataReader radzisz sobie z danymi po jednym rekordzie na raz i nie przechowujesz żadnych danych w pamięci. Oczywiście w przypadku DataTable lub DataSet masz narzut alokacji pamięci.
Jeśli nie musisz przechowywać danych w pamięci, więc tylko do renderowania rzeczy, przejdź do SqlDataReader. Jeśli chcesz radzić sobie z danymi w sposób rozłączony, wybierz DataAdapter, aby wypełnić DataSet lub DataTable.
Użyj SqlDataAdapter, gdy chcesz wypełnić DataSet / DataTable w pamięci z bazy danych. Dzięki temu masz możliwość zamykania / usuwania połączenia, przekazywania datatable / ustawiania w pamięci. Następnie można manipulować danymi i utrwalać je z powrotem w bazie danych za pomocą adaptera danych w połączeniu z funkcją InsertCommand / UpdateCommand.
Użyj SqlDataReader, gdy chcesz uzyskać szybki dostęp do danych o małej ilości pamięci bez potrzeby elastyczności, np. Przekazywania danych w ramach logiki biznesowej. Jest to bardziej optymalne do szybkiego pobierania dużych ilości danych z niskim zużyciem pamięci, ponieważ nie ładuje wszystkich danych do pamięci za jednym razem - dzięki podejściu SqlDataAdapter DataSet / DataTable zostanie wypełniony wszystkimi danymi, więc jeśli jest dużo wierszy i kolumn, które będą wymagały dużo pamięci do przechowywania.
Funkcja Fill używa wewnętrznie DataReader. Jeśli rozważasz „Który z nich jest bardziej wydajny?”, To użycie DataReadera w ścisłej pętli, która wypełnia kolekcję rekord po rekordzie, prawdopodobnie będzie obciążać system tak samo, jak użycie DataAdapter.Fill.
(System.Data.dll, System.Data.Common.DbDataAdapter, FillInternal.)