54 / 48 / 31
Регистрация: 14.04.2015
Сообщений: 273

SQL Server и клиентское приложение

21.08.2017, 07:07. Показов 5051. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток.

Друзья подскажите пожалуйста как правильно сделать. Есть обширная база данных на SQL Server 2014 с кучей таблиц, и кучей записей в каждой таблице...предположим по 500 000 тыс. записей. (Базу данных предоставили готовой !)

Написал на коленке приложение которое не посредственно будет работать с этой базой данных (label, textbox, combobox, datagridview, кнопка сохранить удалить подключить изменить(полный комплект =) )). и тут встал вопрос как правильно организовать работу с БД.

1. Как вариант в коде программы писать запросы на выборку нужных мне таблиц (Получаеться в коде слишком много текста на запросы, не красиво, по мне так не профессионально кажеться) =)

2. На Сервере создать представление которое будет отображать все нужные данные (вариант хороший, использую на данный момент) минус в том что не могу разобраться с сохранением и удалением данных. при вставке строчки
Кликните здесь для просмотра всего текста
C#
1
2
3
            adapter.UpdateCommand = command.GetUpdateCommand(); // Редактировать
            adapter.InsertCommand = command.GetInsertCommand(); // Добавить
            adapter.DeleteCommand = command.GetDeleteCommand(); // Удалить
в программу выскакивает не найдены сведения об уникальном ключ.
Использую такую структуру на данном этапе.

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
FbConnection connecting = new FbConnection(@"Строка подключения");
 
        DataSet set = new DataSet();
        FbDataAdapter adapter = new FbDataAdapter();
        FbCommandBuilder command = new FbCommandBuilder();
        BindingSource source;
 
 
            connecting.Open();
            
            adapter = new FbDataAdapter("ЗАПРОС НА ВЫБОРКУ", connecting);
            command = new FbCommandBuilder(adapter);
 
            adapter.UpdateCommand = command.GetUpdateCommand(); // Редактировать
            adapter.InsertCommand = command.GetInsertCommand(); // Добавить
            adapter.DeleteCommand = command.GetDeleteCommand(); // Удалить
 
            adapter.Fill(set, "qwe");
            source = new BindingSource(set, "qwe");
        DGV.DataSource = source;
            VendorDGV.Columns[0].Visible = false;
            AddressTB.DataBindings.Add("Text", source, "VendAddress", true);
            connecting.Close();


Вот с этим кодом программы все работает (Подключение добавление удаление изменение сохранение)

само сохранение реализую таким образом

C#
1
adapter.Update(set, "qwe");

Но проблема состоит в том что когда я загружаю данные в DataSet строчка
C#
1
adapter.Fill(set, "qwe");
Происходит зависание программы, решил обмануть и запихать все в фоновый режим, проблема ушла но у заказчика возник вопрос почему так долго отображаеться таблица. Отследил и оказалось опять эта строчка, с заполнением DataSet.

Уже всю голову себе поломал этой головоломкой. Подскажите как можно ускорить заполнение dataset или подскажите как правильно сделать. Может я не правильно делаю логику программы для работы с данными ?! Суть в том что есть большая таблица на 500 000 тыс. записей и пользователю надо работать со всеми данными(грубо говоря это Номенклатура, реестр заявок и т.д.). Как отобразить быстро такую таблицу.

На код не обращайте внимания, знаю что FB а надо было SQL =) нет под рукой настоящего исходника, логика точно такая же !

Помогите пожалуйста нуждаюсь в совете, всем огромное спасибо !!!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.08.2017, 07:07
Ответы с готовыми решениями:

Клиентское приложение (оболочка) на C# для БД (MS SQL Server)
Необходимо создать клиентское приложение на С# на тему Агентство по организации праздников. Необходимо, чтобы через приложение добавлялись...

Приложение на C# и SQL Server
Здравствуйте! Помогите хоть толкнуть меня, я новичок в СИ, а сам программист в Дельфи. Задали мне такое задание. Создать приложение,...

Приложение неправильно передает значение от sql server
Здравствуйте, делаю лабораторную, и мне нужно сделать проверку разрешения у пользователя на изменение, удаление и т.д определенной таблицы ...

16
Эксперт .NET
 Аватар для insite2012
5546 / 4309 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
21.08.2017, 07:19
Цитата Сообщение от Welcome20 Посмотреть сообщение
есть большая таблица на 500 000 тыс. записей и пользователю надо работать со всеми данными
Что, прямо таки сразу и со всеми? Вы же, надеюсь, адекватный человек и должны понимать, что столько записей просто невозможно отобразить сразу на экране. Да и человек охватить такой объем информации сразу не в силах.
Отсюда вывод - запрашивать и отображать данные постепенно, по мере их, например, прокрутки в отображении. Улавливаете суть?
1
54 / 48 / 31
Регистрация: 14.04.2015
Сообщений: 273
21.08.2017, 07:57  [ТС]
Хм...суть уловил что надо сделать типо постраничного просмотра данных.

Но до конца не могу в голове собрать исходники

к примеру, когда мы заходим на форму мы сперва загружаем 500 строк, а когда прокрутили вниз загрузили еще 500 строк.
И так далее пока не дойдем до самого низа. Но тут вопрос возник в том что если мне сразу нужно последние значение таблицы ? к примеру делаю фильтр. То как это будет выглядить ?! вот чего не могу собрать в голове.
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
21.08.2017, 09:02
Цитата Сообщение от Welcome20 Посмотреть сообщение
последние значение таблицы ? к примеру делаю фильтр
Элементарно, делайте фильтр ДО загрузки данных.
Представьте себе ситуацию у гугла - там лярды записей. И как бы работал браузер, если бы гугл выдавал все эти записи одним заходом?
Вся суть в деталях - у Вашего шефа маниакальное желание объять необъятное - это нереально, почитайте умные книжки, разсудите сами - человек не в силах уловить в голове даже 1000 записей, а Вы хотите 500000 - это просто ппц. При этом даже если Вы загрузите 500 записей, а дальше в фоне будете загружать еще 499 000 - то при обновлении грида программа всё равно зависнет. Ну т.е. заполнение таблицы незаметно, а вот при датасорсе - "ляжет".
Да и смысл то какой держать в оперативке столько записей, да еще и работать с гридом?
1
54 / 48 / 31
Регистрация: 14.04.2015
Сообщений: 273
21.08.2017, 09:39  [ТС]
Так все ближе и ближе истина ! =) спасибо господа за ответы но тема актуально.

Я же говорю есть грубо говоря таблица Номенклатура которая собрана из 3 таблиц, в общем составило 500 000 записей (это для примера что бы понять что к чему).

Сперва при открытии формы пользователю нужно показать что все данные есть на форме (Ребята будем ориентироваться на тех задание, мне тоже это не нужно по 3 миллиона записи им выводить и держать это все в памяти, у них компы сгорят).

Давайте ориентироваться на 1с 2 - х летнию базу. Как там реализовано ? заходим в справочник авансов к примеру, а он нам раз и 1000 где то вывел, пролистал на самый вверх спустя от 2 - 5 секунд он мне показал остаток таблицы. Так главное что это еще и быстро прошло. Кажеться в реестре счетов там та же история, тоже большая таблица и все быстро загружаеться и подгружаеться.

Так вот к примеру как мне реализовать что то подобное.

С гуглом я согласен он не грузит все данные, так вот этот момент я не могу понять как делаеться и что бы скорость заполнения была, так еще и все грубо говоря данные вывел, и с ними можно было работать.

Делать фильтр до загрузки данных

То есть делаю запрос на выборку данных, делаю фильтр а уже потом вывожу ?
Но как тогда посмотреть остаток данных и как пользователь будет работать с поиском и своим фильтром ?!

Да пользователь не сможет работать со всеми но как минимум с двумя десятками точно будет. Суть в том чтобы есть 2 большие таблицы и combobox при выборе в combobox фильтруеться одна таблица. У этой таблице есть ID по которому фильтруеться вторая таблица. На просторах сайт задавал вопрос как сделать, разобрался спасибо за ответы и подсказки.

Или вы имеете в виду сделать пустые таблицы при открытии формы, а пользователь пусть начинает лепить себе запрос ? типо в combobox мне нужны такие то данные, и нажал на кнопку ему и показалось. Или как ?!

Добавлено через 5 минут
Цитата Сообщение от Welcome20 Посмотреть сообщение
типо в combobox мне нужны такие то данные, и нажал на кнопку ему и показалось. Или как ?!

Запечатался и не поняно рассказал =)

Пользователь открывает форму а она пустая, выбирает к примеру в комбобокс ("сухофрукты") и нажимает кнопку что бы ему отобразилось только в большой таблице сухофрукты и так каждый раз делать ? (как понимаю фильтрация до заполнения)

А при выборе в большой таблице Ягоды опять нажимает на кнопку и уже в соседней таблице выводит поставщиков этих Ягод! Получаеться что так ? Но это не актуально и очень не удобно.
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
21.08.2017, 12:45
Ну раз уж посло воспоминание 1с-ки - то тогда вспоминаем процесс запуска.
Что видим? - а видим бегущие строчки подгрузки справочников.
И когда выводились список счетов, то после 200-300 тыс - он тоже начинал висеть, даже в 7-ой версии, а восьмая и подавно.
Тогда делайте при запуске задержку на подгрузку таблиц в биндинг, а после запуска обновляйте биндингом свой грид, ну пусть повисит (в принципе - вообще программа зависнет на некоторое время) - и покажется весь набор.
Если бизнесу нужно именно такое решение - ну пусть тогда так. У нас бизнес согласился, что при выборе реестра документов (счетов, договоров) - сначала нужно отфильтровать по каким-то признакам (дата, сап-номер, какие-то внутренние показатели), чтобы не вылезал грид на сотни тысяч строк, а вылезли на тысячи строк.
Каждому своё, как говориться )
1
 Аватар для Aferuga
644 / 528 / 324
Регистрация: 20.05.2015
Сообщений: 1,469
22.08.2017, 05:02
Цитата Сообщение от Welcome20 Посмотреть сообщение
Или вы имеете в виду сделать пустые таблицы при открытии формы,
Не обязательно пустые, первично можно отобразить top 500 записей а дальше работать через фильтр.
Цитата Сообщение от Welcome20 Посмотреть сообщение
Но это не актуально и очень не удобно.
С чего вдруг?
При этом это может быть не обязательно combobox, а textBox например.
Для ввода новой записи например отображать таблицу вообще не нужно, нужно лишь отобразить форму для заполнения.

Как вариант можно разбить таблицу на две скажем за текущий год и архив(если он используется редко)
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
22.08.2017, 10:17
Лучший ответ Сообщение было отмечено Welcome20 как решение

Решение

А я даже скажу почему так произошло. Есть 3 момента у ТС
1.
Цитата Сообщение от Welcome20 Посмотреть сообщение
Написал на коленке приложение
Ну пусть, представим, что это нормально.

2.
Цитата Сообщение от Welcome20 Посмотреть сообщение
Как вариант в коде программы писать запросы на выборку нужных мне таблиц (Получаеться в коде слишком много текста на запросы, не красиво, по мне так не профессионально кажеться) =)
Для MS SQL давным давно придумали хранимые процедуры, получается и красиво, и профессионально, и текста совсем немного, и не нужно городить ерунду с вьюшками на 500 000 записей, а потом не зная что с этим всем делать.

3. Обновление с гридов - опять же можно говнокодом работать, кидая между клиентом и сервером все записи, а можно красиво отправлять только измененные записи (а таких у клиента будет только несколько), и процесс обновления БД станет в разы быстрее и "красивее".

Таких моментов можно описать довольно много, но суть - с базами данных нужно работать не так как с текстом.
0
22.08.2017, 10:23

Не по теме:

Цитата Сообщение от hoolygan Посмотреть сообщение
Для MS SQL давным давно придумали хранимые процедуры, получается и красиво, и профессионально
В принципе да. Пока эти процедуры не начнут вызывать другие процедуры, которые вызывают другие процедуры... [и понеслась] :)

1
22.08.2017, 11:27

Не по теме:

Цитата Сообщение от Usaga Посмотреть сообщение
Пока эти процедуры не начнут вызывать другие процедуры, которые вызывают другие процедуры
Ну тут многое от квалификации зависит, и желания сделать, чтобы красиво :)
У нас был случай, когда человек вообще не владел сиквелом, но пробовал что-то писать, проработал недолго, но мучительно было исправлять за ним, ну т.е. вот в точности как и сказал - делал отдельные процедуры для каждой таблицы на каждый функционал - т.е. запускал в теле хранимки 3 хранимки подряд - на update, insert, delete с передачей 2-6 Мб текста как параметры между ними. В общем когда начали смотреть почему тормозят простые на первый взгляд формочки - то ужаснулись даже стажеры :D

1
54 / 48 / 31
Регистрация: 14.04.2015
Сообщений: 273
23.08.2017, 09:13  [ТС]
Еще раз всем спасибо за активность в данной теме.

Проверил на создание хранимой процедуры и вызова её в программе. (Проверил только на FB, через часа 4 проверю на SQL)

Честно скажу проверил так, запихал в
C#
1
adapter = new FbDataAdapter("ЗАПРОС НА ВЫБОРКУ", connecting);
не будем вникать +) все и так все знают =) таблица была на 5000 строк, с большим количеством проверю позже. Загрузилось буквально за 2 секунды...не удачный пример.

Дальше на сервере FB создал процедуру которая не принимает параметров, а только возвращает 3 поля. Подключаю её в проекте точно такой же стройчкой
C#
1
2
                FbDataAdapter adapter = new FbDataAdapter(stNameDB, connect);
                adapter.SelectCommand.CommandType = System.Data.CommandType.StoredProcedure;
и соответственно говорю что это процедура =)
Верьте нет но он секунд 30 думал, а только потом за 1.5 - 2 секунды вывел результат.

То есть как я понял он 30 секунд выполнял процедуру, если зайти через IBExpert и выполнить эту же процедуру то она выполниться за минуту полторы, через программу секунд 30 но это было 5000 записей.

Процедура просто 3 выходных параметра и выборка с таблицы.

Может я что то не так делаю ?!
0
Эксперт .NET
 Аватар для Usaga
13907 / 9106 / 1330
Регистрация: 21.01.2016
Сообщений: 34,113
23.08.2017, 10:08
Цитата Сообщение от Welcome20 Посмотреть сообщение
Может я что то не так делаю ?!
Можно было бы посмотреть текст тела процедуры.
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
23.08.2017, 10:20
И мне бы очень хотелось посмотреть.
И понять - зачем в процедуре селекта делать выходные параметры, если она спокойно сама будет отдавать всё, без параметров. Мало того, на селекты еще и отключай подсчет строк (ну это уже само собой).
Чуствуется мне, что текст процедуры ооооочень кривой, если она 30 сек "думает". Для примера:
T-SQL
1
2
3
4
5
6
7
8
9
create procedure SelectFromMyTable
@data int
as
begin
set nocount on;
select [column1], [column2]
from myTable
where [column3] = @data
end
Вот никогда не поверю, что она будет компилировать и выполняться дольше, чем выборка написана непосредственно в клиенте с передачей параметра. Ну вот хоть убейте не поверю.
0
54 / 48 / 31
Регистрация: 14.04.2015
Сообщений: 273
23.08.2017, 11:03  [ТС]
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SET TERM^;
CREATE OR ALTER PROCEDURE MyNewProcedure
RETURNS(
A VARCHAR(200),
B VARCHAR(200),
C VARCHAR(200))
AS
BEGIN
FOR
SELECT domov_cht_ob.fulladdress, domov_cht_ob.fias_adres, domov_cht_ob.fias_guid
FROM domov_cht_ob
INTO :A, :B, :C
do
suspend;
END^
SET TERM;^
Завтра конечно же попробую и ваш вариант как для примера, но мой ни чем не отличается почти.
Сейчас уже буду пробывать делать на SQL Servere тестировал на FireBird

Не обесуйте за процедуру =) впервый раз писал скрипт на создание....
На другие варианты птица ругаеться на меня...буду сейчас пробывать на Server 2014
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
23.08.2017, 11:35
Буду откровенен, FB вообще не знаю, так что только в общих чертах понял действия этой Вашей процедурки.
0
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,897
23.08.2017, 12:24
Цитата Сообщение от hoolygan Посмотреть сообщение
Вот никогда не поверю, что она будет компилировать и выполняться дольше, чем выборка написана непосредственно в клиенте с передачей параметра. Ну вот хоть убейте не поверю.
http://www.queryprocessor.ru/f... app-part1/
просвящайся
1
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
23.08.2017, 12:57
Цитата Сообщение от pincet Посмотреть сообщение
просвящайся
Об этой статье я уже давно знаю, поэтому и написал конкретный пример
У меня параметр имеет тип и в предикате используется именно он (параметр), а не динамически созданная переменная
Да и сама выборка настолько простая, что план построится почти мгновенно.
Я не к тому вел разговор, что процедуры всегда работают быстрее, а к тому, что использование процедур упрощает код в разы в сравнении с созданием десятка представлений.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.08.2017, 12:57
Помогаю со студенческими работами здесь

Многопользовательское приложение для работы с БД SQL Server
Собственно проблема в том, что мне нужно 3 вида пользователя: Админ, Редактор БД, Пользователь. При входе в программу пользователь...

клиентское приложение афиши
АААА!!!!!!! Помогите кто может!!!!!!!!!!! Нужно создать приложение афиши (хотя бы для кинотеатров или театров), в котором доступ к данным...

Клиентское приложение + удалённый сервер БД
Доброго времени суток. Пишу клиентское приложение, которое будит взаимодействовать с БД на удалённом сервере. И вот зашёл в тупик...

Ищу готовое приложение на C# с базой данных на Access или SQL Server
Добрый день! У кого есть готовый база данных, реализованное на C# а база на ACCESS или SQL SERVER. Буду благодарен.

Почему не следует возвращать DataSet на клиентское приложение?
Вопрос тревожит. Делал маленькую прогу: клиент - вебсервис - БД. Вебсервис отправлял данные на клиента по запросу от клиента. ...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

Новые блоги и статьи
Тестирование Pull Request в Kubernetes с vCluster
Mr. Docker 19.07.2025
Часто сталкиваюсь с серьезной дилемой при настройке тестовых окружений для проверки Pull Request в Kubernetes. С одной стороны, каждый PR требует изолированной среды — только так можно гарантировать,. . .
Мой 7 минутный ролик с крамольным предложением про шахматы, предлагаю заценить
_Ivana 18.07.2025
p2UhJNMGY94
Десять Middleware Node.js для эффективного кодинга
Reangularity 18.07.2025
Когда я только начинал работать с Node. js, количество пакетов в npm меня буквально парализовало. Сегодня их больше 1,3 миллиона — попробуй разберись, что стоит твоего внимания, а что нет. Я потратил. . .
Context и глубины Android
mobDevWorks 18.07.2025
В Android разработки Context напоминает воздух - он везде, жизненно необходим, но мало кто может детально объяснить его природу. Мы привыкли получать его как параметр, передавать дальше и. . .
Результаты исследования от команды MCM (июль 2025 г.)
Programma_Boinc 18.07.2025
Результаты исследования от команды MCM (июль 2025 г. ) Как сообщалось в наших предыдущих публикациях, мы изучаем гены, которые имеют наибольший рейтинг и ассоциируются с различными видами рака, в. . .
ИИ-чатбот на React с OpenAI и LangChain.js
Reangularity 17.07.2025
React давно стал для меня золотым стандартом фронтенд-разработки. Его компонентная структура, виртуальный DOM и однонаправленный поток данных идеально подходят для создания динамичных интерфейсов. . .
Пишем адаптер для локального хранилища S3 на C#
stackOverflow 16.07.2025
Разработка современных приложений часто требует интеграции с объектными хранилищами, и Amazon S3 стал де-факто стандартом в этой области. Однако работа с облачными сервисами в процессе разработки. . .
Старые замки
kumehtar 16.07.2025
Смотрел тут фото, попались пара старых замков. И сразу бросилось в глаза из отличие. Например: Замок Бистон, в англии. Разрушенное сооружение. Но - не испорченное людьми, по крайней мере - на. . .
Java и Eclipse Store: Сверхбыстрые приложения с In-Memory DB
Javaican 15.07.2025
Eclipse Store — это микро-движок персистентности для Java, который позволяет хранить и извлекать нативные Java-объекты без необходимости преобразования данных или использования объектно-реляционного. . .
EmBitz, создание проекта, отладка, прошивка
locm 15.07.2025
Создание проекта для Blue Pill (STM32F103C8T6) в EmBitz 2. 30, написания кода blink, запуск отладки в ОЗУ, заливка релизной прошивки во flash используя ST-Link и др. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru