Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
Ищущий знания
 Аватар для Felix Felicis
11 / 8 / 4
Регистрация: 31.05.2015
Сообщений: 209

Поиск по базе данных

07.03.2019, 21:08. Показов 1813. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Есть клиент и сервер, написаны на WPF с помощью WCF. База данных сделана в mdb формате (Access).
Есть метод поиска по базе

C#
1
2
3
4
5
6
7
8
9
10
11
12
public DataSet Search(string SearchString, string SearchColumn, string NameOrder) 
        {
            DataSet Search = new DataSet();
            string query = // поиск по одному столбцу
              "SELECT Дата, ПИ, [Номер извещения], Обозначение, Наименование, Код, [Причина изменения], Фамилия, Отдел, Телефон FROM [" +
             NameOrder + "] WHERE ([" + SearchColumn + "] LIKE '%" + SearchString + "%')  ORDER BY [Номер извещения]";
           
            OleDbDataAdapter oda = new OleDbDataAdapter(query, Connect.conn);
            oda.Fill(Search, NameOrder);
            Console.WriteLine("Search: " + SearchString);
            return Search;
        }
и результат присваиваю DataGrid
C#
1
 TableNotice.ItemsSource =(Client.Search(StringSearch, SearchColoumn.Text,ListOrder.SelectedItem.ToString())).Tables[0].DefaultView;
в Client.Search просто идет запрос в метод, который самый первый тут.

И если клиент и сервер на одном компьютере, то запрос-ответ проходят быстро и без проблем. А если уже клиент на другом компьютере, то все это происходит с задержкой от 0.2-1 секунды(на вскидку).
Как можно ускорить процесс отображения результатов?

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

Есть у кого мыслишки?


Уходить от Access не вариант
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.03.2019, 21:08
Ответы с готовыми решениями:

Поиск в базе данных
Здравствуйте, я создавала базу данных, с помощью sql, интегровала ее в visual studio. В этой базе есть таблица "Ученые" а в ней...

Поиск в базе данных
Добрый день всем! У меня такой вопрос: как осуществить поиск в бд чтобы вводя в textBox искомое слово начинающееся с прописной или строчной...

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

22
Эксперт .NET
 Аватар для Usaga
14136 / 9356 / 1350
Регистрация: 21.01.2016
Сообщений: 35,164
08.03.2019, 06:22
Цитата Сообщение от Felix Felicis Посмотреть сообщение
Как можно ускорить процесс отображения результатов?
Нужно смотреть что именно тормозит. Скорее всего выгребается сильно много данных. Это можно решить ограничив количество получаемых данных.

Цитата Сообщение от Felix Felicis Посмотреть сообщение
но DataGrid не получается заполнить из массива.
А между тем, DataGridView поддерживает всё, что реализует IList<T>, в том числе и массивы.

Цитата Сообщение от Felix Felicis Посмотреть сообщение
Уходить от Access не вариант
Для этого нужно доказать, что именно эта СУБД тормозит. Если вы её инструктируете на выгрузку тысяч объектов, то такие тормоза - вина ваша, а не СУБД.

Добавлено через 1 минуту
И не надо конкатенацией параметры в запрос передавать. ИСпользуйте параметризированные запросы. Это не только исключит возможность SQL-инекций, но и повлияет на производительность, ибо СУБД сможет закешировать запрос, а при повторном его приходе, просто подставить параметры.
1
Ищущий знания
 Аватар для Felix Felicis
11 / 8 / 4
Регистрация: 31.05.2015
Сообщений: 209
08.03.2019, 08:26  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
1. Нужно смотреть что именно тормозит. Скорее всего выгребается сильно много данных. Это можно решить ограничив количество получаемых данных.


2. А между тем, DataGridView поддерживает всё, что реализует IList<T>, в том числе и массивы.


Для этого нужно доказать, что именно эта СУБД тормозит. Если вы её инструктируете на выгрузку тысяч объектов, то такие тормоза - вина ваша, а не СУБД.

Добавлено через 1 минуту
И не надо конкатенацией параметры в запрос передавать. ИСпользуйте параметризированные запросы. Это не только исключит возможность SQL-инекций, но и повлияет на производительность, ибо СУБД сможет закешировать запрос, а при повторном его приходе, просто подставить параметры.
1. Изначально в таблице, по которой ведётся поиск, где то около 500 значений. Так что не думаю, что это много значений.

2. Может важно, но у меня wpf и там DataGrid. Я делал раньше проект в WinForms и таблица глючила только пока я ее скролил

А по поводу параметров - только вчера вечером узнал про них, до этого везде другой синтаксис видел. Попробую переписать запросы потом.

DataGrid принимает значение переменной DataSet и у меня не получилось ни в какой другой тип данных их перенести, чтобы хранить их в переменной у клиента и осуществлять поиск строго в рамках компьютера клиента (надеюсь, что не запутанно написал)
0
Эксперт .NET
 Аватар для Usaga
14136 / 9356 / 1350
Регистрация: 21.01.2016
Сообщений: 35,164
08.03.2019, 08:52
Felix Felicis, сначала найдите что тормозит. Ответ от базы или визуализация. И если это ответ от базы, то что именно не так: база долго думает или передача по сети долгая.

Без этого начинать что-то оптимизировать не имеет смысла.
0
Ищущий знания
 Аватар для Felix Felicis
11 / 8 / 4
Регистрация: 31.05.2015
Сообщений: 209
08.03.2019, 08:56  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Felix Felicis, сначала найдите что тормозит. Ответ от базы или визуализация. И если это ответ от базы, то что именно не так: база долго думает или передача по сети долгая.

Без этого начинать что-то оптимизировать не имеет смысла.
Ну если исходить из того, что если все лежит на одном компьютере, то работает мгновенно, а если уже клиента на другом компьютере и все медленней работает , то передача по сети долгая.
0
Эксперт .NET
 Аватар для Usaga
14136 / 9356 / 1350
Регистрация: 21.01.2016
Сообщений: 35,164
08.03.2019, 12:35
Felix Felicis, а долгой она может быть из-за объёма передаваемых данных.
0
Ищущий знания
 Аватар для Felix Felicis
11 / 8 / 4
Регистрация: 31.05.2015
Сообщений: 209
08.03.2019, 13:42  [ТС]
Usaga, тогда вопрос в том, что можно ли как то из массива string данные заполнить в DataGrid?
0
Эксперт .NET
 Аватар для Usaga
14136 / 9356 / 1350
Регистрация: 21.01.2016
Сообщений: 35,164
08.03.2019, 13:43
Felix Felicis, массив строк? Строки в таблице из одной колонки, чтоли, будут?
0
13 / 11 / 2
Регистрация: 07.03.2019
Сообщений: 29
08.03.2019, 13:47
Можно top 1 попробовать добавить - посмотреть, будет ли тормозить на 1 записи. Если будет, то возможно с сетью что-то не то.
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
08.03.2019, 15:01
Цитата Сообщение от Felix Felicis Посмотреть сообщение
Изначально в таблице, по которой ведётся поиск, где то около 500 значений.
Затягиваете эти 500 строк на клиент и там уже фильтруете. Будет отрабатывать мгновенно.
0
Ищущий знания
 Аватар для Felix Felicis
11 / 8 / 4
Регистрация: 31.05.2015
Сообщений: 209
08.03.2019, 15:05  [ТС]
Usaga, почему из одной? Будет Igr_ok, а как фильтровать данные в DataSet?
0
Эксперт .NET
 Аватар для Usaga
14136 / 9356 / 1350
Регистрация: 21.01.2016
Сообщений: 35,164
08.03.2019, 15:17
Felix Felicis, потому, что DataGrid воспринимает (что логично) каждый элемента массива\коллекции как отдельную запись.

Вам нужен не массив строк, а массив нормальных объектов, где каждое свойство будет соответствовать своей ячейке в строке.
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
08.03.2019, 16:03
Цитата Сообщение от Felix Felicis Посмотреть сообщение
а как фильтровать данные в DataSet?
1.BindingSource имеет свойство Filter
https://docs.microsoft.com/en-... ew-control
https://docs.microsoft.com/en-... work-4.7.2
2.DataTable.DataView https://docs.microsoft.com/en-... work-4.7.2
3.Используя Linq.
0
Ищущий знания
 Аватар для Felix Felicis
11 / 8 / 4
Регистрация: 31.05.2015
Сообщений: 209
09.03.2019, 01:31  [ТС]
Igr_ok, это для WinForms же, а я пишу в WPF

Добавлено через 3 минуты
Usaga,
Этим методом я экспортирую БД
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
25
            string[][] BD;
            string copy = "Select * from [" + Order + "]";
            string val = "Select count(*) from [" + Order + "]";
 
            OleDbCommand command = new OleDbCommand(copy, Connect.conn);
            OleDbCommand com = new OleDbCommand(val, Connect.conn);
            com = new OleDbCommand(val, Connect.conn);
            BD = new string[Convert.ToInt32(com.ExecuteScalar())][];
 
 
            OleDbDataReader reader = command.ExecuteReader();
 
            int i = 0;
           
            while (reader.Read())
            {
 
                BD[i] = new string[12] { reader[0].ToString(), reader[1].ToString(), reader[2].ToString(), reader[3].ToString(), reader[4].ToString(), reader[5].ToString(), reader[6].ToString(),
                reader[7].ToString(),reader[8].ToString(),reader[9].ToString(),reader[10].ToString(),reader[11].ToString()};
                i++;
 
            }
            reader.Close();
            StartServer.LogWrite("БД " + Order + " экспортирована пользователем " +Surname);
            return BD;
И думал таким же способом можно держать таблицу у клиента в переменной и с ней работать, но из массива не получается заполнить DataGrid
0
Эксперт .NET
 Аватар для Usaga
14136 / 9356 / 1350
Регистрация: 21.01.2016
Сообщений: 35,164
09.03.2019, 07:10
Felix Felicis, нафига вы получаемые данные склеиваете в строку? Вы как её потом на ячейки разбивать собрались? Заведите класс под данные получаемые из базы и заполняйте массив объектами этого класса. DataGrid может работать с такими вещами спокойно.
0
Ищущий знания
 Аватар для Felix Felicis
11 / 8 / 4
Регистрация: 31.05.2015
Сообщений: 209
09.03.2019, 09:26  [ТС]
Usaga, делаю массив строк BD, передаю клиенту в массив g и данные заношу в новый файл Access, который сохранил пользователь у себя на компьютера
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
25
26
27
28
29
30
31
   
string[] hh = new string[12];
 g = Client.ImportBD(ListOrder.SelectedItem.ToString(), UserInformation.Surname);
 
 
                    foreach (string[] gg in g)
                    {
                        val = 0;
                        foreach (string ggg in gg)
                        {
                            hh[val] = ggg;
                            val++;
                            // MessageBox.Show(hh[val]+"    "+hh[val]);
                        }
                        string imp = "INSERT INTO [" + ListOrder.SelectedItem.ToString() +
                       "] (Дата , ПИ , [Номер извещения] , Обозначение , Наименование , Код , [Причина изменения] , Фамилия , Отдел , Телефон , UserName , PCname ) VALUES ('"
                              + hh[0] +
                              "','" + hh[1] +
                              "','" + hh[2] +
                              "','" + hh[3] +
                              "','" + hh[4] +
                              "','" + hh[5] +
                              "','" + hh[6] +
                              "','" + hh[7] +
                              "','" + hh[8] +
                              "','" + hh[9] +
                              "','" + hh[10] +
                              "','" + hh[11] + "')";
                        Operation(imp, ImportBDstring);
 
                    }
0
Эксперт .NET
 Аватар для Usaga
14136 / 9356 / 1350
Регистрация: 21.01.2016
Сообщений: 35,164
09.03.2019, 09:47
Felix Felicis, эта болезнь называется "строковая типизация". Проявляется в виде неуталимого желания везде и всюду использовать строки или массивы строк.

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

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

Добавлено через 16 минут
Ещё один плохой момент: имя таблицы заменяемо, но список полей тот же самый. Это значит, что в базе как минимум несколько абсолютно идентичных таблиц. Это очень хреновая архитектура базы. Копипаста.
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
09.03.2019, 10:44
Цитата Сообщение от Felix Felicis Посмотреть сообщение
Igr_ok, это для WinForms же, а я пишу в WPF
Прошу прощения, не обратил внимание. Пример для коллекции объектов: http://wpf-tutorial-net.blogsp... ample.html
0
Ищущий знания
 Аватар для Felix Felicis
11 / 8 / 4
Регистрация: 31.05.2015
Сообщений: 209
09.03.2019, 17:44  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Felix Felicis, эта болезнь называется "строковая типизация". Проявляется в виде неуталимого желания везде и всюду использовать строки или массивы строк.
Ваша правда, уверен, что в некоторых местах перебарщиваю, но очень стараюсь писать нормальный код

Цитата Сообщение от Usaga Посмотреть сообщение

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


Цитата Сообщение от Usaga Посмотреть сообщение

Не используйте конкатенацию для передачи параметров в запрос. Это небезопасно, непроизводительно и выглядит ужасно.
Да, мне уже говорили об этом, нужно использовать параметры, типа такого
SQL
1
INSERT INTO Class1 (METHODID, DESCRIPTION, METHODTYPEID, TEXTDESCRIPTION) VALUES (@a, @b, @c, @d)
Цитата Сообщение от Usaga Посмотреть сообщение
Ещё один плохой момент: имя таблицы заменяемо, но список полей тот же самый. Это значит, что в базе как минимум несколько абсолютно идентичных таблиц. Это очень хреновая архитектура базы. Копипаста.
Есть список разных приборов, допустим А, Б и В. Для каждого из них периодически выделяются номера, чтобы под этими номерами вносить изменения. И сейчас на работе это 3 разные книги, каждая для своего прибора. Вот и таблицы 3 штуки. А иначе как делать? Есть еще таблица, где хранятся названия приборов и какие номера им выдали (диапазон номеров), и таблица пользователей с паролями.

Цитата Сообщение от Usaga Посмотреть сообщение
Заведите класс, описывающий данные, которыми хотите работать. Передавайте этот класс методу сохранения в базу. Загружайте в него данные, приходящие из базы.
Не до конца понимаю, как это должно выглядеть. Можно какой-нибудь пример-набросок?
0
13 / 11 / 2
Регистрация: 07.03.2019
Сообщений: 29
09.03.2019, 17:48
Есть список разных приборов, допустим А, Б и В. Для каждого из них периодически выделяются номера, чтобы под этими номерами вносить изменения. И сейчас на работе это 3 разные книги, каждая для своего прибора. Вот и таблицы 3 штуки. А иначе как делать? Есть еще таблица, где хранятся названия приборов и какие номера им выдали (диапазон номеров), и таблица пользователей с паролями.
Таблица должна быть одна, в ней должна быть колонка "Тип прибора". Сделать отдельную таблицу типов, и тип прибора должен ссылаться на эту таблицу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.03.2019, 17:48
Помогаю со студенческими работами здесь

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

Поиск по базе данных
Здравствуйте! Есть ли в VS 2015 встроенный поиск по базе данных, например я хочу вывести данных из таблицы в виджет datagridview и...

Поиск в Базе Данных
I. SQL Server 2014 Management Studio MS Visual Studio 2017 RC Win Forms C# Файл .mdf находится в папке с .exe II. Есть...

Поиск в базе данных С#
Здравствуйте. Получилось сделать поиск в базе данных по столбцам типа nvarchar SqlCommand myCommand = new SqlCommand(&quot;SELECT *...

Поиск по базе данных
Здравствуйте, привязал БД аксес к c# форме , нужно реализовать поиск в бд. Пользователь может искать по Городу, Фамилии, Имени,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru