Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
кофе с инеем_
6 / 6 / 4
Регистрация: 02.05.2012
Сообщений: 40
1

Необходимость частого обновления dataGridView при частом обновлении данных в источнике

25.07.2014, 10:53. Просмотров 684. Ответов 2
Метки нет (Все метки)

Платформа Microsoft .NET Framework 3.0
БД Oracle 11g
Подключение к БД через ODAC 11.2 Release 3 (11.2.0.2.1)


Добрый день, мне необходимо вывести результат выборки из базы Oracle в dataGridView, и только для чтения.
Сложность в том, что данные в таблицах из которых делается выборка, часто меняются.
Хотелось бы эти данные как можно чаще обновлять и в самом же dataGridView.
Обновление решил сделать через таймер, каждые 3 секунды.
Вот что у меня получилось:
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
namespace nsTest
{
    public partial class controlTest : UserControl
    {
        private Oracle.DataAccess.Client.OracleConnection con;
        private Oracle.DataAccess.Client.OracleDataAdapter adp;
        private String strcon;
        private DataSet ds;
        private System.Windows.Forms.DataGridView dataGridView;
        private System.Windows.Forms.Timer timer;
 
        public controlTest()
        {
            InitializeComponent();
            this.strcon = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=***)(PORT=***)))(CONNECT_DATA=(SERVICE_NAME=***)));User Id=***;Password=***;";
            this.con = new OracleConnection(this.strcon);
            this.con.Open();
            this.adp = new OracleDataAdapter("SELECT * FROM VW_TEST", this.con);
            this.ds = new DataSet();
            this.adp.Fill(ds, "VW_TEST");
            this.dataGridView = new DataGridView();
            this.Controls.Add(this.dataGridView);
            this.dataGridView.Dock = DockStyle.Fill;
            this.dataGridView.DataSource = this.ds.Tables["VW_TEST"];
            this.timer = new Timer();
            this.timer.Interval = 1000 * 3;
            this.timer.Tick += new EventHandler(timer_Tick);
            this.timer.Enabled = true;
        }
 
        void timer_Tick(object sender, EventArgs e)
        {
            this.adp.Update(this.ds, "VW_TEST");
            this.ds.Tables["VW_TEST"].AcceptChanges();
            this.dataGridView.Refresh();
        }
    }
}
Вроде все работает, однако после обновления данных в dataGridView, сбивается курсор и позиция скроллов.
Ко всему еще добавилось местами мерцание самого dataGridView.
Помогите, подскажите, как правильно через таймер обновлять данные в dataGridView, чтоб этого не было заметно?
или возможно стоит все это делать через OracleDependency?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.07.2014, 10:53
Ответы с готовыми решениями:

Ошибка при обновлении данных в БД из DataGridView при определенном условии
Собственно проблема в следующем... в приложение добавил обновление БД из dgv. Сделано по примеру,...

Ошибка при обновлении данных "Для обновления требуется действительный UpdateCommand"
Народ, помогите! Непонятно почему, при обновлении базы данных вдруг появилось сообщение "Для...

Оптимизация изображения для сохранения (и очень частого обновления) в БД
Всем привет, Предистория: На днях я загорелся идеей изобретения велосипеда :) А именно решил...

Пометка признака выбора строки DataGridView в источнике данных
Имеется DataTable - DT с колонками SEL и ULCODE. Имеется Форма FRM с DataGridView - DGV_LPU с...

Необходимость обновления ключа при долгом простое клиента
Здравствуйте, Имеется служба WCF +кастомная политика авторизации( логин и пароль)+защита на...

2
alexeyNET
7 / 7 / 3
Регистрация: 18.06.2014
Сообщений: 43
28.07.2014, 01:23 2
Я советую не заморачиваться с перевыборкой из БД. так как вы сильно нагружаете клиента.
Задумайтесь о том, как правильно послать запрос на сервер с БД.
0
Learx
1046 / 853 / 194
Регистрация: 31.03.2010
Сообщений: 2,490
28.07.2014, 12:57 3
1) Насколько я знаю ADO.NET команда Update выполняет Insert, Update и Delete команды, а не Select.
2) лучше для привязки данных использовать BindingSource:
C#
1
2
3
4
5
6
7
BindingSource bs;
//....
bs = new BindingSource(this.ds, "VW_TEST");
this.dataGridView.DataSource = bs;
//...
[S]this.dataGridView.Refresh();[/S]
bs.ResetBindings(false);
3) 3 секунды - это слишком частое обновление, приложение будет подвисать просто-напросто.
да, лучше использовать OracleDependency, в крайнем случае снизить частоту обновления хотя бы до 30 секунд и запрос к БД вынести в отдельный поток.
4) А вообще БД не предназначена для таких задач. следует рассмотреть альтернативные решения - какие-нибудь простые сообщения-пакеты для своего приложения.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.07.2014, 12:57

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

Обновление сетки при изменениях в источнике данных
Есть коллекция (класс от CollectionBase) его я отображаю в сетке, но при добавлении или удалении из...

Ошибка при обновлении datagridview
Здравствуйте! Такая проблема! Есть datagrid. Первый раз, когда я выполняю запрос все работает...


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

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

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