Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Большая выборка и DataSet / 25 сообщений из 65, страница 1 из 3
03.04.2018, 09:57
    #39624489
Oomel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большая выборка и DataSet
Добрый день, товарищи!

Прочитал много гугла, но внятного решения не нашел. Надеюсь вы сможете подсказать.

На сервере SQL имеется табличка. 67 полей с типами Int, Binary(8), varchar(255), Decimal(31,15). Количество строк >5kk.
Прирост данных ~30к в месяц.

У меня стоит задача эту табличку вывести в DataGridView.

Пробовал делать через DataSet и SqlDataReader. При любом из вариантов при сборке x86 приложения выхватываю OutOfMemory.
При сборке x64 приложение выедает гигабайты оперативной памяти.

Все данные при выгрузке приводятся к System.String.

Общий принцип выгрузки такой:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
using System.Data.SqlClient;

/*------------------------------------------------*/

string connString = string.Format("Data Source = {0}; User ID = {1}; Password = {2}", "serverName", "loginName", "password");
SqlConnection curConnection = new SqlConnection(connString);

curConnection.Open();

DataSet data = new DataSet();

SqlDataAdapter dataAdapter_FILES = new SqlDataAdapter("select * from MyFkngBigTable", curConnection);

dataAdapter_FILES.Fill(data, "FILES_DTA"); //OutOfMemoryException ибо записей очень много а памяти очень мало

BindingSource bsAllOfMyData = new BindingSource
{
    DataSource = data,
    DataMember = "FILES_DTA"
};

dataGridView.DataSource = bsAllOfMyData;
curConnection.Close();
curConnection.Dispose();



Не покидает стойкое ощущение, что я что-то делаю неправильно.
...
Рейтинг: 0 / 0
03.04.2018, 10:08
    #39624494
big-duke
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большая выборка и DataSet
Oomel,

вам точно на клиенте нужно отобразить сразу ВСЕ строки ?
Посмотрите в сторону пейджинга, скуль его давно поддерживает.
...
Рейтинг: 0 / 0
03.04.2018, 10:16
    #39624500
Oomel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большая выборка и DataSet
Можно не все.

Суть в том, чтобы показать клиенту все данные из этой таблицы, удовлетворяющие фильтрам.
Фильтры строятся по всем столбцам таблицы.

Таблица представляет собой некий журнал событий, регистрирующей изменения в других таблицах.
...
Рейтинг: 0 / 0
03.04.2018, 10:33
    #39624510
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большая выборка и DataSet
Oomel,
Вы не слышите что вам пишут.
На строке fill
Вся база качается на клиента.
Вам нужна пагинация.
Видели такое?
...
Рейтинг: 0 / 0
03.04.2018, 10:35
    #39624513
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большая выборка и DataSet
Oomel,

Dataset такое не выдержит

Datagridview в виртуальном режиме для начала
...
Рейтинг: 0 / 0
03.04.2018, 10:41
    #39624522
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большая выборка и DataSet
Petro123,

Тупая пагинация - от бедности

В msacess грид неплохо сделан
...
Рейтинг: 0 / 0
03.04.2018, 10:46
    #39624529
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большая выборка и DataSet
ИзопропилТупая пагинация - от бедности
Во всех языках программирования (ЯП) с талами фигово. Увы.

ИзопропилВ msacess грид неплохо сделан
Ссылку? Не видел.
Вообще, в net планформе должен быть))
...
Рейтинг: 0 / 0
03.04.2018, 10:47
    #39624533
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большая выборка и DataSet
Petro123талами
С таблицами
...
Рейтинг: 0 / 0
03.04.2018, 10:47
    #39624534
Oomel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большая выборка и DataSet
Petro123,

Я вполне услышал :). Но не сталкивался с таким подходом. У Вас, случаем, не найдется примера?
...
Рейтинг: 0 / 0
03.04.2018, 10:56
    #39624546
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большая выборка и DataSet
Petro123Вся база качается на клиента.
Вам нужна пагинация.Как пагинация поможет при фильтрации на клиенте?
Фильтрация в этому случае должна быть на сервере. Качать готовый отфильтровайнный и сджойненный результат, а не пытаться на клиента всю базу перекачать - не для того СУБД придумывали, чтобы на клиенте все делать.
...
Рейтинг: 0 / 0
03.04.2018, 10:57
    #39624547
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большая выборка и DataSet
Oomel
Код: c#
1.
select *

звездочка - вообще зло!
...
Рейтинг: 0 / 0
03.04.2018, 11:00
    #39624556
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большая выборка и DataSet
Oomel,
У меня табла от телерик.
А запрос на нужную страничку:
Queryable.Skip(номерСтранички....
NuGet....pagedList.
...
Но я коллекционирую и другие варианты как и вы)).
...
Рейтинг: 0 / 0
03.04.2018, 11:02
    #39624558
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большая выборка и DataSet
Shocker.ProPetro123Вся база качается на клиента.
Вам нужна пагинация.Как пагинация поможет при фильтрации на клиенте?
Фильтрация в этому случае должна быть на сервере. Качать готовый отфильтровайнный и сджойненный результат, а не пытаться на клиента всю базу перекачать - не для того СУБД придумывали, чтобы на клиенте все делать.
Как пагинация мешает фильтрации?
...
Рейтинг: 0 / 0
03.04.2018, 11:05
    #39624562
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большая выборка и DataSet
Petro123Как пагинация мешает фильтрации?Пагинация выполняется ПОСЛЕ фильтрации. Поэтому пагинация сама по себе не сможет уменьшить количество записей, передаваемых с сервера, если выполняется на клиенте. Так что фильтрацию надо выполнить на сервере, а пагинация - это уже второй вопрос
...
Рейтинг: 0 / 0
03.04.2018, 11:10
    #39624568
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большая выборка и DataSet
Shocker.Pro,
Про работу на клиенте вы сами придумали. Я не говорил что работаю на клиенте с большими выборками.
...
Рейтинг: 0 / 0
03.04.2018, 11:13
    #39624571
big-duke
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большая выборка и DataSet
Shocker.ProПоэтому пагинация сама по себе не сможет уменьшить количество записей, передаваемых с сервера, если выполняется на клиенте.
А кто говорит, что пейджинг на клиенте ???
Я отфильтровал данные на сервере и получил 1М строк.
После этого использую пейджинг на сервере и уменьшаю количество строк передаваемых с сервера.
...
Рейтинг: 0 / 0
03.04.2018, 11:14
    #39624572
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большая выборка и DataSet
5 вариантов paging, выбирай:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
CREATE PROCEDURE [dbo].[_Paging]
@PageNumber int = 3, 
@PageSize int = 2
as
declare @Table as table (Id int primary key)
insert @Table (Id) values(1) insert @Table (Id) values(2) insert @Table (Id) values(3) insert @Table (Id) values(4) insert @Table (Id) values(5)
declare @Offset int
set @Offset = (@PageNumber - 1) * @PageSize + 1
--1. TOP (N) (нужно считать @ActualPageSize)
select *
	from
	(select top (@PageSize)	* 
		from (select top (@PageSize * @PageNumber) *
				from @Table
				order by Id desc) as T1
		order by Id asc) as T2
	order by Id desc
--2. ROW_NUMBER
select * 
	from
	(select *, row_number() over (order by Id desc) as row_number 
		from @Table) T
	where row_number between @Offset and @Offset + @PageSize - 1;
--3. ROW_NUMBER with CTE
with T as 
(select *, row_number() over (order by Id desc) as row_number
		from @Table)
select * 
	from T
	where row_number between @Offset and @Offset + @PageSize - 1;
--4. ROW_NUMBER with CTE and JOIN
with T as 
(select Id, row_number() over (order by Id desc) as row_number
		from @Table)
select T1.* 
	from T join @Table T1 on T.Id = T1.Id
	where row_number between @Offset and @Offset + @PageSize - 1;
--5. SET ROWCOUNT
declare @OffsetId int
set rowcount @Offset
select @OffsetId = Id 
	from @Table
	order by Id desc
set rowcount @PageSize
select *
	from @Table
	where Id <= @OffsetId
	order by Id desc
...
Рейтинг: 0 / 0
03.04.2018, 11:14
    #39624573
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большая выборка и DataSet
Shocker.Pro,

При асинхронной загрузке можно и не ждать окончания фильтрации
...
Рейтинг: 0 / 0
03.04.2018, 11:15
    #39624575
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большая выборка и DataSet
Shocker.Pro,

Код: c#
1.
Queryable.where(фильтр...).Skip(пагинация.....
...
Рейтинг: 0 / 0
03.04.2018, 11:16
    #39624576
big-duke
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большая выборка и DataSet
Konst_One,

Я бы еще версию скуля указал , для которой прокат пейджинг
...
Рейтинг: 0 / 0
03.04.2018, 11:18
    #39624577
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большая выборка и DataSet
Konst_One,
Хранимка - привязка к одной субд. Малеееенькая ложка дёгтя.))
...
Рейтинг: 0 / 0
03.04.2018, 11:19
    #39624581
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большая выборка и DataSet
это просто пример, обёрнутый в ХП для удобства
...
Рейтинг: 0 / 0
03.04.2018, 11:21
    #39624585
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большая выборка и DataSet
Konst_Oneэто просто пример, обёрнутый в ХП для удобстваОК.
А панель пейджинга в ГУИ?
...
Рейтинг: 0 / 0
03.04.2018, 11:25
    #39624589
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большая выборка и DataSet
какая панель? у меня вообще сейчас ангуляр
...
Рейтинг: 0 / 0
03.04.2018, 11:25
    #39624590
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большая выборка и DataSet
big-dukeА кто говорит, что пейджинг на клиенте ???
Я отфильтровал данные на сервере и получил 1М строк.
После этого использую пейджинг на сервере и уменьшаю количество строк передаваемых с сервера.А кто говорит, что фильтрация на сервере?
У ТС проблема именно с тем, что он неотфильтрованные данные не может получить в DataSet, ибо их много.
Oomel
Код: c#
1.
2.
3.
SqlDataAdapter dataAdapter_FILES = new SqlDataAdapter("select * from MyFkngBigTable", curConnection);

dataAdapter_FILES.Fill(data, "FILES_DTA"); //OutOfMemoryException ибо записей очень много а памяти очень мало
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Большая выборка и DataSet / 25 сообщений из 65, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]