#c# #asp.net #dataset
#c# #asp.net #набор данных
Вопрос:
Моя компания использует необработанные, нетипизированные наборы данных, заполняемые исключительно с помощью хранимых процедур. Мне было поручено найти способ извлечения очень больших наборов результатов (подкачки) и способы получения функциональности отложенной загрузки (по крайней мере, я думаю, что это отложенная загрузка; честно говоря, я все еще изучаю этот материал), чтобы мы не отбирали десятки тысяч строк в одном пакете и не перегружали ресурсы сервера.
Лично я не очень хорошо знаком с наборами данных, поскольку избегаю их, когда это возможно, и я бы предпочел полностью избавиться от них здесь, но сказать «Измените все, чтобы использовать LINQ / EF» не будет правильным ответом, поскольку для управления нет бизнес-ценности (а переделывать что-то заняло бы слишком много времени, поэтому идея была бы немедленно отвергнута).
Есть ли какие-то ресурсы, которые я могу использовать, чтобы получить такую же функциональность, но с использованием стандартных нетипизированных наборов данных?
РЕДАКТИРОВАТЬ: Кроме того, мне нужно решение, которое может работать с динамически создаваемым SQL, который не использует хранимую процедуру.
Комментарии:
1. согласно терминологии, я обычно использую «подкачку» для описания требуемой функциональности; «отложенная загрузка» я использовал для описания частичной начальной загрузки более сложных графов / моделей объектов, за которой на более позднем этапе следует загрузка дополнительных частей графика по требованию, по мере необходимости. [У меня нет ссылки на это, так что, возможно, это просто я …]
2. Кстати, категорически избегать наборов данных — это все равно что избегать
bool
илиint
. Набор данных — это то, что он есть, — хорошо написанное, на 100% надежное, универсальное представление данных базы данных в памяти, и это чрезвычайно полезно в ряде различных ситуаций. Однако, честно говоря, я определенно не стал бы использовать их для веб-сайта с высоким трафиком.3. Я всегда использовал отложенную загрузку в значении «Не выполняйте это, пока мне это действительно не понадобится», но требования, как сказал мой менеджер, были «отложенной загрузкой», поэтому я использую это здесь 🙂 По поводу наборов данных я согласен, но я думаю, что есть гораздо лучшие решения, что есть несколько сценариев, в которых наборы данных являются лучшим выбором, чем альтернативы.
4. «Подкачка» — это своего рода форма отложенной загрузки — просто обычно это так не называется (обычно это называется «подкачка»).
Ответ №1:
Все, что вам нужно сделать, это изменить вашу хранимую процедуру, чтобы вывести результирующий набор на страницу. Это, конечно, также будет означать, что вам придется передавать в качестве параметров определенные критерии, такие как номер страницы и т.д. Предполагая, что вы используете SQL Server 05 или новее, взгляните на следующее:
Ответ №2:
Вам нужно будет реализовать подкачку внутри ваших хранимых процедур. Я предполагаю, что вы используете Sql Server, поэтому вот ссылка:
http://www.davidhayden.com/blog/dave/archive/2005/12/30/2652.aspx
Обратите внимание, что это не имеет ничего общего с наборами данных как таковыми. Предположительно, ваш код генерирует набор данных из вызова хранимой процедуры. Если вы перепишете свои процедуры для подкачки страниц, ваш код затем сгенерирует набор данных, содержащий только записи запрошенной страницы.
Вы могли бы использовать набор данных, возвращаемый вашей исходной процедурой, для реализации подкачки, кэшируя набор данных и возвращая клиенту только выбранные строки (или, точнее, используя только выбранные строки набора данных для генерации клиентского HTML), но это супер-пупер, действительно плохая идея.
Комментарии:
1. Почему вы сказали, что это плохая идея? Я хотел бы узнать ваши комментарии
Ответ №3:
У меня была такая же проблема с asp.net веб-сайт 2.0, для этого нет решения с «отложенной загрузкой». Для разбивки наборов данных на страницы я использую 2 sprocs, которые помогут мне использовать функциональность подкачки при каждом выборе, который я делаю.
CREATE PROCEDURE [dbo].[Generic_Counting]
@tables VARCHAR(MAX),
@filter VARCHAR(MAX) = '1=1'
AS
BEGIN
SET NOCOUNT ON;
DECLARE @strQuery VARCHAR(8000)
SET @strQuery = ' SELECT COUNT(*) FROM ' @tables '
WHERE ' @filter
execute (@strQuery)
IF @@ERROR<>0
BEGIN
--error on generic count
SET NOCOUNT OFF
RETURN 10067
END
SET NOCOUNT OFF
RETURN 0
END
GO
CREATE PROCEDURE [dbo].[Generic_Paging]
@tables VARCHAR(1000),
@pk VARCHAR(100),
@pageNumber INT = 1,
@pageSize INT = 10,
@fields VARCHAR(MAX) = '*',
@filter VARCHAR(MAX) = '1=1',
@orderBy VARCHAR(MAX) = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE @strQuery VARCHAR(8000)
DECLARE @strMinRecord VARCHAR(12);
DECLARE @strMaxRecord VARCHAR(12);
SET @strMinRecord = CONVERT(VARCHAR(12),((@pageNumber -1)*@pageSize 1))
SET @strMaxRecord = CONVERT(VARCHAR(12), (@pageNumber * @pageSize))
-- Use ROW_NUMBER function
SET @strQuery ='
WITH Generic_CTE As
(
SELECT ''RowNumber'' = ROW_NUMBER() OVER(ORDER BY '
ISNULL(@orderBy,@pk) '),'
@fields
' FROM ' @tables
' WHERE (' @filter ')
)
SELECT ' @fields '
FROM Generic_CTE
WHERE RowNumber BETWEEN ' @strMinRecord ' AND ' @strMaxRecord
--print @strQuery
execute (@strQuery)
IF @@ERROR<>0
BEGIN
--error on generic paging
SET NOCOUNT OFF
RETURN 10066
END
SET NOCOUNT OFF
RETURN 0
END
GO
Ответ №4:
Вы могли бы взглянуть на шаблон обработчика списка значений, предназначенный для использования там, где «клиенту требуется список элементов … для презентации. Количество элементов в списке неизвестно и во многих случаях может быть довольно большим.»
Примеры (по ссылке выше и здесь) предназначены для Java, но должны быть переведены на asp.net довольно легко.
Комментарии:
1. Хотелось бы, чтобы люди сказали, почему они голосуют против чего-то; это неплохой совет, единственное, о чем я могу подумать, это немного сложно, когда есть более простые способы (см. Другие ответы), но нет причин ни с того ни с сего голосовать против.
2. -1 было от меня. Две проблемы: 1) это C #, а не Java; и 2) шаблон не является реальным решением. Если бы я уже выпил свой кофе, я, вероятно, не стал бы утруждать себя голосованием против.
3. Не беспокойтесь, просто было любопытно 🙂
4. Тоже было любопытно 🙂 Я понимаю причины, по которым за него проголосовали с понижением; если бы я опубликовал конкретный пример c #, это действительно был бы лучший ответ.