Коллеги, подскажите, как сделать разбивку на страницы результатов поиска на ASP.NET (C#) если страница выводится путем трансформации XML и XSLT. То есть сначала генерируется XML строка, а потом на нее накладывается XSLT шаблон.
Раньше в ADO 2.x у Recordset была ActivePage и с ее помощью можно было это все решить. А сейчас этого не стало. Сейчас и Recordset'a то больше нет.
Я знаю что это можно сделать при помощи гридов и компонентов а можно ли это сдлеать только средствами ADO.NET + SQL?
База данных MS SQL Server.
Спасибо.
ASP.NET question - multipage documents
-
- Уже с Приветом
- Posts: 2049
- Joined: 12 Jul 2000 09:01
- Location: Madison, Wisconsin USA
-
- Ник удалён за неоплаченную рекламу
- Posts: 391
- Joined: 15 May 2002 09:16
- Location: было оттуда, теперь отсюда
-
- Уже с Приветом
- Posts: 2049
- Joined: 12 Jul 2000 09:01
- Location: Madison, Wisconsin USA
alkapin wrote:На уровне базы это нужно делать. Где sql select возвращает только subset рекордов для данной страницы.
да я так и делал - броблема возникает с выведением списка страниц.
Вот код для хранимой процедуры
Code: Select all
ALTER PROCEDURE usp_ContentSearchItems
(
@pageSize int,
@startPosition int,
@searchStirng nvarchar (4000)
)
AS
EXEC ('
SELECT DISTINCT
TOP ' + @pageSize + '
f_id,
f_title,
f_description,
f_menu_alias,
f_author_name,
f_author_url,
f_author_email,
f_date_published
FROM io_content INNER JOIN io_content_search ON io_content.f_id = io_content_search.f_item_id
WHERE (' +@searchStirng + ')
AND f_is_active = 1
AND f_item_id > ' + @startPosition + '
')
Как видно из кода нужно указать размер страницы и последнюю найденную запись на предидущей странице. В случае первой страницы это будет 0.
Все работает отлично ровно до того момента пока не нужно кроме кнопок вперед и назад еще и показать сами страницы. Я что то никак не соображу как узнать на какой странице какое ID буде последним. Они же могут быть пропушенны. То есть какой то элемент может быть удален.
-
- Ник удалён за неоплаченную рекламу
- Posts: 391
- Joined: 15 May 2002 09:16
- Location: было оттуда, теперь отсюда
также, как мне кажется это не будет работать если потребуется добавить сортинг. не претендуя на лучший вариант, могу показать как я это сделал. идея в том чтобы показывать первые, ну скажем 500, результатов поиска. вернее показывать одну страницу, но навигашион делать для первых 500.
prev next 1.2.3.4.5.[6]......49.50
ok i am writing in english, mush faster
and then show on the page a note saying smth like that "first 500 results shown, try to use more specific search".
so in this case you can use sql with temp table and you use temp table's autogenegated keys for paging. you select into temp table first 500 item ids(only) of your items with search conditions and sorting and then join them on other needed tables to get data.
500 first items is for example only. perfomance wise i think u can easily many more ids.
perhaps there are better ways...
regards.
prev next 1.2.3.4.5.[6]......49.50
ok i am writing in english, mush faster
and then show on the page a note saying smth like that "first 500 results shown, try to use more specific search".
so in this case you can use sql with temp table and you use temp table's autogenegated keys for paging. you select into temp table first 500 item ids(only) of your items with search conditions and sorting and then join them on other needed tables to get data.
Code: Select all
CREATE PROCEDURE dbo.sp_Browse
@indx int = 0,
@top int = 10
as
set nocount on
CREATE TABLE #SORTED (indx int IDENTITY, member_id int)
INSERT INTO #SORTED (member_id)
SELECT TOP 500 id FROM members WHERE (active = 1) ORDER BY last_seen DESC
SET ROWCOUNT @top
SELECT 1 as Tag,
NULL as Parent,
[....................]
UNION
SELECT 2,
1,
NULL,
[.................]
FROM #SORTED INNER JOIN members m ON #SORTED.member_id = m.id
[................]
WHERE #SORTED.indx > @indx
ORDER BY [member!2!indx]
FOR XML EXPLICIT
GO
500 first items is for example only. perfomance wise i think u can easily many more ids.
perhaps there are better ways...
regards.
-
- Уже с Приветом
- Posts: 2049
- Joined: 12 Jul 2000 09:01
- Location: Madison, Wisconsin USA
-
- Ник удалён за неоплаченную рекламу
- Posts: 391
- Joined: 15 May 2002 09:16
- Location: было оттуда, теперь отсюда
webdeveloper wrote:Спасибо. Пробую сделать так как сказал - есть только один вопрос - в какой момент нужно дропать таблицу ? Не получится так что результаты разных поисков перемешаются?
Я сейчас удаляю таблицу каждый раз перед тем как искать и потом создаю ее заново. Но что то мне кажется это не очень оптимально.
No, you dont need to drop temp table. It has a scoop of stored procedure and deleted at the end of your stored procedure. Check Books Online for more info.
-
- Уже с Приветом
- Posts: 2049
- Joined: 12 Jul 2000 09:01
- Location: Madison, Wisconsin USA
alkapin wrote:webdeveloper wrote:Спасибо. Пробую сделать так как сказал - есть только один вопрос - в какой момент нужно дропать таблицу ? Не получится так что результаты разных поисков перемешаются?
Я сейчас удаляю таблицу каждый раз перед тем как искать и потом создаю ее заново. Но что то мне кажется это не очень оптимально.
No, you dont need to drop temp table. It has a scoop of stored procedure and deleted at the end of your stored procedure. Check Books Online for more info.
спасибо.
-
- Уже с Приветом
- Posts: 5347
- Joined: 03 Feb 1999 10:01
- Location: NJ, USA
-
- Уже с Приветом
- Posts: 2049
- Joined: 12 Jul 2000 09:01
- Location: Madison, Wisconsin USA
-
- Уже с Приветом
- Posts: 5347
- Joined: 03 Feb 1999 10:01
- Location: NJ, USA
-
- Ник удалён за неоплаченную рекламу
- Posts: 391
- Joined: 15 May 2002 09:16
- Location: было оттуда, теперь отсюда
KVA wrote:А почему CREATE TABLE?alkapin wrote:CREATE TABLE #SORTED (indx int IDENTITY, member_id int)
А не DECLARE @SORTED TABLE (indx int IDENTITY, member_id int)
Дожно быть несколько быстрее (IMHO, исходя из опыта).
The idea is to have temp table with MOST CURRENT snapshot of FILTERED and SORTED data that will be discarded on the end of sp. You can insert into regular "search results" table but then it needs to be cleared anyway. Is that what you have in mind with above code? Thx.
-
- Уже с Приветом
- Posts: 5347
- Joined: 03 Feb 1999 10:01
- Location: NJ, USA