Stronicowanie za pośrednictwem wyniku zapytania

Stronicowanie wyników zapytania to proces zwracania wyników zapytania w mniejszych podzestawach danych lub stron. Jest to powszechna praktyka wyświetlania wyników użytkownikowi w małych fragmentach, które można łatwo zarządzać.

Obiekt DataAdapter zapewnia funkcję zwracania tylko strony danych przez przeciążenia metody Fill . Jednak może to nie być najlepszy wybór do stronicowania za pośrednictwem dużych wyników zapytania, ponieważ chociaż dataAdapter wypełnia obiekt docelowy DataTable lub DataSet tylko żądane rekordy, zasoby do zwrócenia całej kwerendy są nadal używane. Aby zwrócić stronę danych ze źródła danych bez użycia zasobów w celu zwrócenia całego zapytania, określ dodatkowe kryteria zapytania, które zmniejszają liczbę wierszy zwracanych tylko do tych wymaganych.

Aby użyć metody Fill , aby zwrócić stronę danych, określ parametr startRecord , dla pierwszego rekordu na stronie danych i parametr maxRecords dla liczby rekordów na stronie danych.

Poniższy przykład kodu pokazuje, jak użyć metody Fill , aby zwrócić pierwszą stronę wyniku zapytania, w którym rozmiar strony to pięć rekordów.

Dim currentIndex As Integer = 0  
Dim pageSize As Integer = 5  
  
Dim orderSQL As String = "SELECT * FROM dbo.Orders ORDER BY OrderID"  
' Assumes that connection is a valid SqlConnection object.  
Dim adapter As SqlDataAdapter = _  
  New SqlDataAdapter(orderSQL, connection)  
  
Dim dataSet As DataSet = New DataSet()  
adapter.Fill(dataSet, currentIndex, pageSize, "Orders")  
int currentIndex = 0;  
int pageSize = 5;  
  
string orderSQL = "SELECT * FROM Orders ORDER BY OrderID";  
// Assumes that connection is a valid SqlConnection object.  
SqlDataAdapter adapter = new SqlDataAdapter(orderSQL, connection);  
  
DataSet dataSet = new DataSet();  
adapter.Fill(dataSet, currentIndex, pageSize, "Orders");  

W poprzednim przykładzie zestaw danych jest wypełniony tylko pięcioma rekordami, ale zwracana jest cała tabela Orders . Aby wypełnić zestaw danych tymi samymi pięcioma rekordami, ale zwrócić tylko pięć rekordów, użyj klauzul TOP i WHERE w instrukcji SQL, jak w poniższym przykładzie kodu.

Dim pageSize As Integer = 5  
  
Dim orderSQL As String = "SELECT TOP " & pageSize & _  
  " * FROM Orders ORDER BY OrderID"  
Dim adapter As SqlDataAdapter = _  
  New SqlDataAdapter(orderSQL, connection)  
  
Dim dataSet As DataSet = New DataSet()  
adapter.Fill(dataSet, "Orders")
int pageSize = 5;  
  
string orderSQL = "SELECT TOP " + pageSize +
  " * FROM Orders ORDER BY OrderID";  
SqlDataAdapter adapter = new SqlDataAdapter(orderSQL, connection);  
  
DataSet dataSet = new DataSet();  
adapter.Fill(dataSet, "Orders");  

Należy pamiętać, że podczas stronicowania wyników zapytania w ten sposób należy zachować unikatowy identyfikator, który porządkuje wiersze, aby przekazać unikatowy identyfikator do polecenia, aby zwrócić następną stronę rekordów, jak pokazano w poniższym przykładzie kodu.

Dim lastRecord As String = _  
  dataSet.Tables("Orders").Rows(pageSize - 1)("OrderID").ToString()  
string lastRecord =
  dataSet.Tables["Orders"].Rows[pageSize - 1]["OrderID"].ToString();  

Aby zwrócić następną stronę rekordów przy użyciu przeciążenia metody Fill , która przyjmuje parametry startRecord i maxRecords , zwiększ bieżący indeks rekordów według rozmiaru strony i wypełnij tabelę. Pamiętaj, że serwer bazy danych zwraca wszystkie wyniki zapytania, mimo że do zestawu danych jest dodawana tylko jedna strona rekordów. W poniższym przykładzie kodu wiersze tabeli są czyszczone przed wypełnieniem następnej strony danych. Możesz zachować pewną liczbę zwracanych wierszy w lokalnej pamięci podręcznej, aby zmniejszyć liczbę podróży do serwera bazy danych.

currentIndex = currentIndex + pageSize  
  
dataSet.Tables("Orders").Rows.Clear()  
  
adapter.Fill(dataSet, currentIndex, pageSize, "Orders")  
currentIndex += pageSize;  
  
dataSet.Tables["Orders"].Rows.Clear();  
  
adapter.Fill(dataSet, currentIndex, pageSize, "Orders");  

Aby zwrócić następną stronę rekordów bez konieczności zwracania całego zapytania przez serwer bazy danych, określ restrykcyjne kryteria instrukcji SELECT. Ponieważ poprzedni przykład zachował ostatni zwrócony rekord, możesz użyć go w klauzuli WHERE, aby określić punkt początkowy zapytania, jak pokazano w poniższym przykładzie kodu.

orderSQL = "SELECT TOP " & pageSize & _  
  " * FROM Orders WHERE OrderID > " & lastRecord & " ORDER BY OrderID"  
adapter.SelectCommand.CommandText = orderSQL  
  
dataSet.Tables("Orders").Rows.Clear()  
  
adapter.Fill(dataSet, "Orders")  
orderSQL = "SELECT TOP " + pageSize +
  " * FROM Orders WHERE OrderID > " + lastRecord + " ORDER BY OrderID";  
adapter.SelectCommand.CommandText = orderSQL;  
  
dataSet.Tables["Orders"].Rows.Clear();  
  
adapter.Fill(dataSet, "Orders");  

Zobacz też