ASP.NET question - multipage documents

User avatar
webdeveloper
Уже с Приветом
Posts: 2049
Joined: 12 Jul 2000 09:01
Location: Madison, Wisconsin USA

ASP.NET question - multipage documents

Post by webdeveloper »

Коллеги, подскажите, как сделать разбивку на страницы результатов поиска на ASP.NET (C#) если страница выводится путем трансформации XML и XSLT. То есть сначала генерируется XML строка, а потом на нее накладывается XSLT шаблон.

Раньше в ADO 2.x у Recordset была ActivePage и с ее помощью можно было это все решить. А сейчас этого не стало. Сейчас и Recordset'a то больше нет.

Я знаю что это можно сделать при помощи гридов и компонентов а можно ли это сдлеать только средствами ADO.NET + SQL?

База данных MS SQL Server.

Спасибо.
User avatar
alkapin
Ник удалён за неоплаченную рекламу
Posts: 391
Joined: 15 May 2002 09:16
Location: было оттуда, теперь отсюда

Post by alkapin »

На уровне базы это нужно делать. Где sql select возвращает только subset рекордов для данной страницы.
User avatar
webdeveloper
Уже с Приветом
Posts: 2049
Joined: 12 Jul 2000 09:01
Location: Madison, Wisconsin USA

Post by webdeveloper »

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 буде последним. Они же могут быть пропушенны. То есть какой то элемент может быть удален.
User avatar
alkapin
Ник удалён за неоплаченную рекламу
Posts: 391
Joined: 15 May 2002 09:16
Location: было оттуда, теперь отсюда

Post by alkapin »

также, как мне кажется это не будет работать если потребуется добавить сортинг. не претендуя на лучший вариант, могу показать как я это сделал. идея в том чтобы показывать первые, ну скажем 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.

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.
User avatar
webdeveloper
Уже с Приветом
Posts: 2049
Joined: 12 Jul 2000 09:01
Location: Madison, Wisconsin USA

Post by webdeveloper »

Спасибо. Пробую сделать так как сказал - есть только один вопрос - в какой момент нужно дропать таблицу ? Не получится так что результаты разных поисков перемешаются?

Я сейчас удаляю таблицу каждый раз перед тем как искать и потом создаю ее заново. Но что то мне кажется это не очень оптимально.
User avatar
alkapin
Ник удалён за неоплаченную рекламу
Posts: 391
Joined: 15 May 2002 09:16
Location: было оттуда, теперь отсюда

Post by alkapin »

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.
User avatar
webdeveloper
Уже с Приветом
Posts: 2049
Joined: 12 Jul 2000 09:01
Location: Madison, Wisconsin USA

Post by webdeveloper »

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.

спасибо.
User avatar
KVA
Уже с Приветом
Posts: 5347
Joined: 03 Feb 1999 10:01
Location: NJ, USA

Post by KVA »

А почему CREATE TABLE?

alkapin wrote:CREATE TABLE #SORTED (indx int IDENTITY, member_id int)


А не DECLARE @SORTED TABLE (indx int IDENTITY, member_id int)

Дожно быть несколько быстрее (IMHO, исходя из опыта).
User avatar
webdeveloper
Уже с Приветом
Posts: 2049
Joined: 12 Jul 2000 09:01
Location: Madison, Wisconsin USA

Post by webdeveloper »

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, исходя из опыта).


ну где же ты раньше то был :)
User avatar
KVA
Уже с Приветом
Posts: 5347
Joined: 03 Feb 1999 10:01
Location: NJ, USA

Post by KVA »

webdeveloper wrote:ну где же ты раньше то был :)


Водку пил. Кто же две недели около рождества и нового года работает. :mrgreen:
User avatar
alkapin
Ник удалён за неоплаченную рекламу
Posts: 391
Joined: 15 May 2002 09:16
Location: было оттуда, теперь отсюда

Post by alkapin »

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.
User avatar
KVA
Уже с Приветом
Posts: 5347
Joined: 03 Feb 1999 10:01
Location: NJ, USA

Post by KVA »

Я имел ввиду что CREATE TABLE медленнее чем DECLARE TABLE и без особой необходимости CREATE TABLE лучше не использовать. В данном конкретном случае я упустил, что нужно делать выборку по заданной строке. Без CREATE TABLE в этом случае обойтись проблематично.

Return to “Вопросы и новости IT”