Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 31.07.2014
Сообщений: 21

Зависание при заполнении dataset 400 000 записей. Как поместить это в отдельный поток

10.08.2014, 18:06. Показов 1887. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добрый день, такой вопрос: Заполняю dataset таким образом:
C#
1
2
ds = new DataSet();
dataReader.Fill(ds, "моятаблица");
таблицей на 400 000 записей, заполнение происходит долго, что пока в принципе не напрягает, напрягает, что программа перестает откликаться, хотелось бы хотя бы повесить какой-нибудь ProgressBar с непрерывным индикатором, но из-за зависания программы так сделать нельзя, кто-нибудь может подсказать, как исправить, где искать?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.08.2014, 18:06
Ответы с готовыми решениями:

Как поместить контрол в отдельный поток?
Привет. С потоками толком не работал, только пробовал. В UserControl постоянно засылаются данные, которые надо обработать и вывести...

Как поместить алгоритм вычисления выражения в отдельный поток
Добрый вечер. Только начинаю работать с потоками. Приведите пример какой - нибудь пожалуйста. Например есть выражение a+b+c. Как например...

Ошибка переполнения при заполнении DataSet
При нажатии на кнопку происходит заполнение датагрида Dim ds As DataSet Dim da As...

13
403 / 86 / 8
Регистрация: 16.02.2013
Сообщений: 356
10.08.2014, 19:56
400 000 записей в DataSet - это зло.
Не тяните на клиента все, что есть.

Если окончания запроса надо дождаться обязательно - выводите какую-нибудь анимацию "ждите".
Если не надо - запустите заполнение в отдельном потоке.
=============
Стандартного решений по слежению за ходом выполнения запроса не существует, хотя я видел частные решения. Все они увеличивали время выполнения запроса
0
0 / 0 / 0
Регистрация: 31.07.2014
Сообщений: 21
10.08.2014, 20:29  [ТС]
Cat2, Так в том-то и дело, что я хочу, но не могу вывести анимацию "ждите" - виснет вся программа, мне совсем необязательно слежение за уровнем заполнения.

"Если не надо - запустите заполнение в отдельном потоке." можно подробности что это такое и что даст?

Я понимаю, что такое количество записей - зло, но у меня вычисление статистики полученных записей на стороне клиента - нужны все, может быть конечно ручками потом переписать через ExecuteReader, если это ускорит процесс
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
10.08.2014, 20:40
nunnt, BackgroundWorker вам может помочь.
1
Заблокирован
11.08.2014, 00:29
В таких случаях нужно использовать многопоточность.
Вот несколько примеров, разбирайте.
Изменение ProgressBar через отдельный поток
Изменение размера объекта из другого потока
Отображение процесса поключения к SQL Server
0
0 / 0 / 0
Регистрация: 31.07.2014
Сообщений: 21
11.08.2014, 08:32  [ТС]
Windoman, insite2012, Да,спасибо, поможет
0
403 / 86 / 8
Регистрация: 16.02.2013
Сообщений: 356
12.08.2014, 18:53
Цитата Сообщение от insite2012 Посмотреть сообщение
nunnt, BackgroundWorker вам может помочь.
Сейчас есть более мощное оружие - Task

Добавлено через 8 минут
Цитата Сообщение от nunnt Посмотреть сообщение
но у меня вычисление статистики полученных записей на стороне клиента
Тем более это надо считать на сервере, а пользователю показывать только итоги.
Если база MS SQL, то 99% таких задач могут быть решены на T-SQL, а для оставшегося 1% есть хранимые процедуры CLR


http://technet.microsoft.com/r... 31094.aspx
1
 Аватар для Петррр
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
12.08.2014, 19:32
nunnt, загружать все данные в приложение не имеет смысла, пользователь не может видеть все 400 тысяч строк, да и ни к чему ему их видеть. Среди уже готовых решений есть DevExpress Server mode, либо можно попробовать набросать что-то вроде этого, но значительно проще.
1
0 / 0 / 0
Регистрация: 31.07.2014
Сообщений: 21
12.08.2014, 19:52  [ТС]
Петррр, может, но да, я понял что ни к чему, когда увидел сколько ест памяти приложение. А можно вопрос на этот счет? Я сейчас в программе генерирую sql-строку (на основании позиций, которые выбирает пользователь в интерфейсе) и эту строку использую при подключении в
C#
1
2
3
OleDbDataAdapter dataReader = new OleDbDataAdapter(commandTextForDataGrid, connectionString);
ds = new DataSet();
dataReader.Fill(ds, "моятаблица");
далее анализирую dataset - набираю статистику, а можно например набирать статистику через .ExecuteScalar(), так же генерируя строки sql-запросов к базе, но в последнем случае мне не нравится, что как я понимаю для поиска количества значений А и количества значений Б в столбце, надо два sql запроса, соответственно будет два прохода по столбцам (или как там sql запросы работают), что тоже время, в dataset я бы прошелся только один раз подсчитав А и Б, что здесь лучше поизучать и через что реализовать? Ling to Sql?
Да, извиняюсь, если глупый вопрос.
0
 Аватар для Петррр
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
12.08.2014, 20:44
nunnt, вообще, Вы ушли от первоначального вопроса. Но я всё же отвечу. К примеру у вас есть таблица:
Code
1
2
3
4
5
6
7
8
+----+--------+----------+
| id | name   | city     |
+----+--------+----------+
|  1 | John   | New York |
|  2 | Ruslan | Astana   |
|  3 | Misha  | Urupinsk |
|  4 | Denis  | New York |
+----+--------+----------+
Предположим, что Ваше А = 'New York', B = 'Astana', тогда для вычисления количества А и B нужно написать такой запрос:
SQL
1
2
3
4
SELECT city, COUNT(*)
FROM cust
WHERE city IN ('New York', 'Astana')
GROUP BY city;
А результат будет таким:
Code
1
2
3
4
5
6
+----------+----------+
| city     | COUNT(*) |
+----------+----------+
| Astana   |        1 |
| New York |        2 |
+----------+----------+
1
0 / 0 / 0
Регистрация: 31.07.2014
Сообщений: 21
12.08.2014, 20:57  [ТС]
Петррр, ок, спасибо, предыдущий пост с сылкой тоже очень помог
0
403 / 86 / 8
Регистрация: 16.02.2013
Сообщений: 356
12.08.2014, 21:56
Цитата Сообщение от Петррр Посмотреть сообщение
Среди уже готовых решений есть DevExpress Server mode, либо можно попробовать набросать что-то вроде этого, но значительно проще.
О, Господи! Эта-то технология заполнения грида тут причем?
0
 Аватар для Петррр
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
12.08.2014, 22:10
Cat2, рискнул предположить, что все данные отображаются в гриде, поэтому привел пример.
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
13.08.2014, 12:09
nunnt, сервер работает значительно быстрее приложения. просто совершенно разный подход к данным.
следует просто лучше изучить sql он очень гибок. если будут сложности с определенным запросом - спросите на форуме, вам помогут.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.08.2014, 12:09
Помогаю со студенческими работами здесь

Вывести содержимое 5 000 000 страниц, а парсер останавливается на 400
Значит так проблема состоит в том, что мне нужно вывести содержимое 5 000 000 ов страниц, а парсер останавливается на 400 страницах иногда...

Остановить отдельный поток при закрытии программы
Здравствуйте! Я создал отдельный поток для функции public Form1() { InitializeComponent(); ...

Как в С++ Builder из 2х потоков рисовать на форме квадратики(это первый поток рисует) и кружочки (2ой поток))
Помогите пожалуйсмта))))) Как в С++ Builder из 2х потоков рисовать на форме квадратики(это первый поток рисует) и кружочки (2ой поток))

Как поместить функцию в отдельный файл?
Здраствуйте. Подскажите пожайлуста как в С++ Builder6 поместить функцию в отдельный файл (модуль)? #include <vcl.h> #pragma...

При помещении в отдельный поток сокет перестает видеть входные сообщения
Программа является посредником между клиентом и сервером, при новом подключении клиента создается новый объект класса, содержащего...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru