Stránkování prostřednictvím výsledku dotazu

Stránkování prostřednictvím výsledku dotazu je proces vrácení výsledků dotazu v menších podmnožinách dat nebo stránkách. Toto je běžný postup zobrazení výsledků uživateli v malých, snadno spravovatých blocích.

DataAdapter poskytuje zařízení pro vrácení pouze stránky dat prostřednictvím přetížení Fill metody. To ale nemusí být nejlepší volbou pro stránkování prostřednictvím velkých výsledků dotazu, protože i když dataAdapter vyplní cíl DataTable nebo DataSet jenom požadované záznamy, prostředky, které vrátí celý dotaz, se stále používají. Pokud chcete vrátit stránku dat ze zdroje dat bez použití prostředků k vrácení celého dotazu, zadejte další kritéria pro dotaz, která snižují počet řádků vrácených pouze na požadované řádky.

Chcete-li použít Fill metodu pro vrácení stránky dat, zadejte parametr startRecord, pro první záznam na stránce dat a parametr maxRecords pro počet záznamů na stránce dat.

Následující příklad kódu ukazuje, jak použít Fill metoda k vrácení první stránky výsledku dotazu, kde velikost stránky je pět záznamů.

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");  

V předchozím příkladu je datová sada vyplněna pouze pěti záznamy, ale vrátí se celá tabulka Orders . Pokud chcete datovou sadu vyplnit stejnými pěti záznamy, ale vrátit pouze pět záznamů, použijte v příkazu SQL klauzule TOP a WHERE, jako v následujícím příkladu kódu.

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");  

Všimněte si, že při stránkování výsledků dotazu tímto způsobem je nutné zachovat jedinečný identifikátor, který seřadí řádky, aby příkaz předal jedinečné ID, aby se vrátila další stránka záznamů, jak je znázorněno v následujícím příkladu kódu.

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

Chcete-li vrátit další stránku záznamů pomocí přetížení Fill metoda, která přebírá parametry startRecord a maxRecords , zvýší index aktuálního záznamu o velikost stránky a vyplní tabulku. Nezapomeňte, že databázový server vrátí celé výsledky dotazu, i když se do datové sady přidá jenom jedna stránka záznamů. V následujícím příkladu kódu jsou řádky tabulky před vyplněním další stránky dat vymazány. Možná budete chtít zachovat určitý počet vrácených řádků v místní mezipaměti, abyste snížili počet cest k databázovému serveru.

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");  

Pokud chcete vrátit další stránku záznamů, aniž by databázový server vrátil celý dotaz, zadejte omezující kritéria pro příkaz SELECT. Vzhledem k tomu, že předchozí příklad zachoval poslední vrácený záznam, můžete ho použít v klauzuli WHERE k určení výchozího bodu dotazu, jak je znázorněno v následujícím příkladu kódu.

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");  

Viz také