C # DGV - Показать Live MYSQL таблицу БД - PullRequest
0 голосов
/ 02 июня 2018

У меня есть сценарий, в котором несколько пользователей (около 50 одновременно), подключенных к одной таблице, постоянно вносят изменения в уже существующие строки.Что мне нужно сделать, так это как-то всегда показывать в реальном времени базу данных.

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

При первой загрузке базы данных я использую

mydtadp = new MySqlDataAdapter();
bindingSource1 = new BindingSource();
table = new DataTable();
MySqlConnection MyConn = new MySqlConnection(MyConnection);
MyConn.Open();

mydtadp.SelectCommand = new MySqlCommand("SELECT * FROM `Appointments`", MyConn);
cmbl = new MySqlCommandBuilder(mydtadp);


mydtadp.Fill(table);

bindingSource1.DataSource = table;
dataGridView1.DataSource = bindingSource1;

Однако, когда другой пользователь вносит изменение, это не обновляет локальный DataGridView, чтобы отразить изменение.После поиска в Интернете я попытался установить для свойства VirtualMode значение true.Все еще не повезло.

Затем я создал таймер, который будет тикать раз в секунду и который будет вызывать

dataGridView1.Refresh();

Тем не менее, когда другой пользователь обновит базу данных, изменения не будут отражены в локальном DGV.,Я нашел другую статью, в которой предлагалось попробовать

bindingSource1.ResetBinding(false); 

Я включил это в свой таймер на функцию тиков, но все еще не обновлял.

Я нашел статью о MDSN , в которой предлагалось попробовать снова вызвать функцию mydtadp.Fill(table); в функции таймера.То же самое.

Единственное, что я смог заставить работать, - это сохранить индекс текущей выбранной строки, затем полностью перезагрузить набор данных, а затем повторно выбрать этот индекс.Однако, это кажется неуклюжим, и должен быть лучший способ сделать это.Этот метод кажется плохой практикой, и он не очень хорошо работает, DGV мигает всякий раз, когда тикает таймер, и когда пользователь перемещает курсор, требуется несколько секунд, чтобы сетка данных догнала пользователя.Когда пользователь вносит изменения в строку, каждое нажатие клавиши требует полной отметки времени для обновления.

1 Ответ

0 голосов
/ 15 июня 2018

Я бы не рекомендовал вам полностью обновлять DGV каждый раз, так как это приведет к проблемам с производительностью.

Вы можете добавить столбец DateTime в свою таблицу MySQL, а когда таблица базы данных обновится, вы просто добавите в нее текущий DateTime.В вашем приложении WinForms вы также добавляете переменную для хранения последнего запроса DateTime.

Затем, когда тикает таймер, вы просто выбираете только те строки, которые были обновлены начиная с переменной DateTime.

Наконец, вы индивидуально обновляете соответствующие строки DGV.DataSource (я полагаю, это System.Data.DataView) свежими данными из запроса SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...