Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# и базы данных, ADO.NET

Войти
Регистрация
Восстановить пароль
 
SevSeverial
0 / 0 / 0
Регистрация: 09.02.2014
Сообщений: 84
#1

Задержка/тормоза компонента DataGridView - C#

10.07.2016, 15:33. Просмотров 267. Ответов 10
Метки нет (Все метки)

Есть БД (access, *.mdb)
В ней 4 таблицы, иерархически связанные
Вывожу одну таблицу (Исполнители). Отображаю в одном DGV
По событию клика в этом DGV строится в другом DGV (Альбомы) связанная информация
Перемещаясь по таблице Исполнители заметны тормоза вывода Альбомов - именно при запросе на альбомы (при скроле все хорошо)
Таблица Исполнители - 3 поля, Альбомы - 5
Где могут быть косяки с моей стороны, влияющие на производительность?
Как можно добиться в этой задаче увеличения производительности?

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
namespace MusicDataBase
{
   public partial class Form_MML : Form
   {
      OleDbConnection vOleDbConnection; //для соединения
      OleDbConnectionStringBuilder vOleDbConnectionStringBuilder = new OleDbConnectionStringBuilder();
      DataTable vDataTableG, vDataTableS, vDataTableI, vDataTableA;
      OleDbDataAdapter vOleDbDataAdapterG, vOleDbDataAdapterS, vOleDbDataAdapterI, vOleDbDataAdapterA;
      int vClick = 0;
      string vSQLI = @"SELECT[Исполнители-группы].[Название исполнителя-группы], [Исполнители-группы].[Название стиля], [Исполнители-группы].[Последние изменение] " +
         "FROM [Исполнители-группы]";
      string vSQLA = @"SELECT Альбомы.[Название альбома], Альбомы.[Оценка альбома], Альбомы.[Название исполнителя-группы], Альбомы.[Год альбома], Альбомы.[Последнее прослушивание] " +
               "FROM Альбомы " +
               "Where Альбомы.[Название исполнителя-группы] = '";
 
      private void dataGridViewI_CellClick(object sender, DataGridViewCellEventArgs e)
      {
         vDataTableA.Clear();
         vOleDbDataAdapterA.SelectCommand.CommandText = vSQLA + dataGridViewI.CurrentRow.Cells[0].Value.ToString() + "'";
         vOleDbDataAdapterA.Fill(vDataTableA);
         dataGridViewA.DataSource = vDataTableA; // ---------------- ЗДЕСЬ ЗАМЕТНА ПОТЕРЯ ПРОИЗВОДИТЕЛЬНОСТИ ----------------
      }
 
      private void dataGridViewI_CurrentCellChanged(object sender, EventArgs e)
      {
         if (vClick == 1)
         {
            button1.Text = dataGridViewI.CurrentRow.Cells[0].Value.ToString();
            vDataTableA.Clear();
            vOleDbDataAdapterA.SelectCommand.CommandText = vSQLA + dataGridViewI.CurrentRow.Cells[0].Value.ToString() + "'";
            vOleDbDataAdapterA.Fill(vDataTableA);
            dataGridViewA.DataSource = vDataTableA;
         }
      }
 
      public Form_MML() 
      {
         InitializeComponent();
         mLog("Запуск программы");
         mNachalo();
         mDiscon();
         mLog("Программа запущена");
      }
 
      private void button1_Click(object sender, EventArgs e)
      {
         vClick = 1;
         button1.Text = dataGridViewI.CurrentRow.Cells[0].Value.ToString();
      }
 
      public void mConnect() //соединение с БД
      {
         try
         {
            vOleDbConnection.Open();
         }
         catch (Exception vException)
         {
            mLog("Ошибка соединения: " + vException.Message);
         }
      }
 
      public void mDiscon() //Разрыв
      {
         try
         {
            vOleDbConnection.Close();
         }
         catch (Exception vException)
         {
            mLog("Ошибка закрытия соединения: " + vException.Message);
         }
      }
 
      public void mLog(string vLog) //Лог
      {
         DateTime vDateTime = DateTime.Now;
         int vKolStr = 10 - 1;
         if (listBox_Log.Items.Count >= vKolStr + 1)
         {
            listBox_Log.Items.RemoveAt(vKolStr);
            listBox_Log.Items.Insert(0, vDateTime.ToString("d") + " [" + vDateTime.ToString("T") + "] " + vLog);
         }
         else
         {
            listBox_Log.Items.Insert(0, vDateTime.ToString("d") + " [" + vDateTime.ToString("T") + "] " + vLog);
         }
      }
 
      public void mNachalo()
      {
         vOleDbConnectionStringBuilder.DataSource = @"C:\Users\Администратор\Desktop\mml.mdb";
         vOleDbConnectionStringBuilder.Provider = "Microsoft.ACE.OLEDB.12.0";
         vOleDbConnection = new OleDbConnection(vOleDbConnectionStringBuilder.ConnectionString);
         mConnect(); //подключение к БД
 
         vDataTableG = new DataTable("G");
         vDataTableS = new DataTable("S");
         vDataTableI = new DataTable("I");
         vDataTableA = new DataTable("A");
         vOleDbDataAdapterG = new OleDbDataAdapter(@"", vOleDbConnection);
         vOleDbDataAdapterS = new OleDbDataAdapter(@"", vOleDbConnection);
         vOleDbDataAdapterI = new OleDbDataAdapter(vSQLI, vOleDbConnection);
         vOleDbDataAdapterA = new OleDbDataAdapter(@"", vOleDbConnection);
 
         vOleDbDataAdapterI.Fill(vDataTableI);
         dataGridViewI.DataSource = vDataTableI;
      }
   }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2016, 15:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Задержка/тормоза компонента DataGridView (C#):

Ввод данных в БД MS Access при помощи компонента DataGridView - C#
Доброго времени суток! Подскажите, каким образом, при помощи компонента DataGridView вносить изменения в базу?

Написать класс, который изменяет свойства компонента DataGridView - C#
У меня на форме размещено 3 пустых компонента DataGridView, хочу создать класс который позволит мне быстро изменять свойства данных...

Вывод информации в DataGridView в зависимости от выбора в другом DataGridView - C# Access - C#
В 1м DataGridView У меня предприятия, при выборе какого-то 1 предприятия, во 2й DataGridView появляются все записи с тем же ключом. Общий...

Нажав на значение (строку) из одного DataGridView поиск в другом DataGridView - C#
Всем привет. Есть 2 DataGridView в одном только дата, а во втором дата и много других столбиков. Нужно при нажатии в 1 DataGridView на дату...

Подставить данные из combobox в DatagridView при создании новой записи в этом DatagridView - C#
Здравствуйте! Возможно я плохо искал, но я искал ответ или наводку на решение. Подскажите пожалуйста: Есть таблица User, записи которой...

Во втором DataGridView отобразить данные, используя значения выбранной строчки первого DataGridView - C#
Доброго времени суток, Ув. Форумчане! Такой вопрос: Во во втором DataGridView отобразить данные используя значения выбранной строчки...

10
insite2012
Модератор
Эксперт .NET
4536 / 3488 / 841
Регистрация: 12.10.2013
Сообщений: 10,279
Записей в блоге: 2
10.07.2016, 17:03 #2
Цитата Сообщение от SevSeverial Посмотреть сообщение
косяки с моей стороны, влияющие на производительность
Могу предположить, что вывод источника данных в DGV является узким местом.
Цитата Сообщение от SevSeverial Посмотреть сообщение
Как можно добиться в этой задаче увеличения производительности?
Ну как вариант - динамически подгружать данные в DGV. Запросом заполнить коллекцию данных и вывести только то количество, что полностью видно в DGV, при скролле перезаплнять грид.
0
SevSeverial
0 / 0 / 0
Регистрация: 09.02.2014
Сообщений: 84
11.07.2016, 00:13  [ТС] #3
Цитата Сообщение от insite2012 Посмотреть сообщение
Ну как вариант - динамически подгружать данные в DGV. Запросом заполнить коллекцию данных и вывести только то количество, что полностью видно в DGV, при скролле перезаплнять грид.
Там, где заметны тормоза, т.е. в таблицы Альбомы, записей не больше 10 - даже при выводе одной записи - как будто "долго" обрабатывается сам запрос. ~2000 исполнителей и ~4000 альбомов в таблицах

Добавлено через 8 минут
Даже как-то своеобразно он тормозит - скроллишь, ищешь что-то "быстро" и он на секунд 20 зависнет
0
Igr_ok
318 / 305 / 106
Регистрация: 04.08.2015
Сообщений: 780
11.07.2016, 09:34 #4
Цитата Сообщение от SevSeverial Посмотреть сообщение
C#
1
string vSQLA = @"SELECT Альбомы.[Название альбома], Альбомы.[Оценка альбома], Альбомы.[Название исполнителя-группы], Альбомы.[Год альбома], Альбомы.[Последнее прослушивание] " + "FROM Альбомы " + "Where Альбомы.[Название исполнителя-группы] = '";
В фильтре лучше указывать id таблицы, из которой берутся данные. Так работает быстрее всего.(Кстати, убедитесь, что все ваши таблицы имеют первичные ключи). Если же по id не получается, нужно создать индекс для поля, по которому осуществляется поиск.
Цитата Сообщение от SevSeverial Посмотреть сообщение
Даже как-то своеобразно он тормозит - скроллишь, ищешь что-то "быстро" и он на секунд 20 зависнет
Для относительно небольших таблиц можно получить все данные из таблицы и потом применять фильтр к источнику данных. Это будет работать быстрее, чем обращение к БД.
0
SevSeverial
0 / 0 / 0
Регистрация: 09.02.2014
Сообщений: 84
11.07.2016, 11:14  [ТС] #5
Цитата Сообщение от Igr_ok Посмотреть сообщение
Для относительно небольших таблиц можно получить все данные из таблицы и потом применять фильтр к источнику данных. Это будет работать быстрее, чем обращение к БД.
Создать Dataset и оперировать с ним?
0
Igr_ok
318 / 305 / 106
Регистрация: 04.08.2015
Сообщений: 780
11.07.2016, 11:28 #6
Цитата Сообщение от SevSeverial Посмотреть сообщение
Создать Dataset и оперировать с ним?
Да. Фильтровать можно так:
https://msdn.microsoft.com/ru-ru/lib...=vs.90%29.aspx
0
SevSeverial
0 / 0 / 0
Регистрация: 09.02.2014
Сообщений: 84
11.07.2016, 11:33  [ТС] #7
Цитата Сообщение от Igr_ok Посмотреть сообщение
Да. Фильтровать можно так:
https://msdn.microsoft.com/ru-ru/lib...=vs.90%29.aspx
Другого варианта нет? Я про Dataset. Интересуясь DS, читал много негативных отзывов о нем и рекомендации использования ORM - почитал-посмотрел что такое Entity Framework и не заинтриговал
0
Igr_ok
318 / 305 / 106
Регистрация: 04.08.2015
Сообщений: 780
11.07.2016, 11:42 #8
Цитата Сообщение от SevSeverial Посмотреть сообщение
Другого варианта нет?
Есть, конечно. Зависит от того, что вы пишете. Если бизнес-приложение, то напрашивается ORM. А для курсовой вам вполне хватит ADO.Net.
0
SevSeverial
0 / 0 / 0
Регистрация: 09.02.2014
Сообщений: 84
11.07.2016, 11:51  [ТС] #9
Цитата Сообщение от Igr_ok Посмотреть сообщение
Если бизнес-приложение, то напрашивается ORM. А для курсовой вам вполне хватит ADO.Net.
хорошо) Тогда вернемся к началу. Возможности ORM могут решить мою проблему с тормозами DGV?
0
Igr_ok
318 / 305 / 106
Регистрация: 04.08.2015
Сообщений: 780
11.07.2016, 12:17 #10
Цитата Сообщение от SevSeverial Посмотреть сообщение
Возможности ORM могут решить мою проблему с тормозами DGV?
Нет. Если запрос к БД выполняется долго, стоит начать с оптимизации запроса. И покажите ваш код, на какое событие вы повесили фильтрацию.
0
SevSeverial
0 / 0 / 0
Регистрация: 09.02.2014
Сообщений: 84
11.07.2016, 12:45  [ТС] #11
Цитата Сообщение от Igr_ok Посмотреть сообщение
Если запрос к БД выполняется долго, стоит начать с оптимизации запроса.
Я смотрел в ту сторону. Прошу третьих лиц мне подсказать (мне кажется там все ровно)
Цитата Сообщение от Igr_ok Посмотреть сообщение
И покажите ваш код, на какое событие вы повесили фильтрацию.
Весь код в шапке - 1ый запрос формирует первую таблицу, по щелчку по нужной строке формируется запрос с условием для выборки во вторую таблицу.

Добавлено через 23 минуты
Закрыл открытый access. Вывод результата во вторую таблицу ускорился на процентов 60. Потестирую в таком режиме
0
11.07.2016, 12:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2016, 12:45
Привет! Вот еще темы с ответами:

MS SQL Вывод информации в DataGridView в зависимости от выбора в другом DataGridView - C#
Прошу прощения сразу же потому что видел много тем похожих, но ответа так и не могу найти. Есть два датагрида, к первому привязана таблица...

Нужно, чтобы при выборе элемента в одном DataGridView отображались связанные данные в другом DataGridView - C#
Есть две связанные таблицы и соответственно два DataGridView, нужно, чтобы при выборе элемента в одном DataGridView отображались связанные...

Тормоза при выполнении запросов к БД Firebird - C#
Добрый день! Прошу вашего совета: Есть форма C# на которой есть datagridview. Данные берутся из БД Firebird: DataTable dt = new...

Задержка экрана - C#
Доброго времени суток! Нужна помощь. Нужно, что бы программа вычисляла количество слов с определенным символом. Задержку экрана сделать не...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru