У меня есть сценарий, в котором несколько пользователей (около 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 мигает всякий раз, когда тикает таймер, и когда пользователь перемещает курсор, требуется несколько секунд, чтобы сетка данных догнала пользователя.Когда пользователь вносит изменения в строку, каждое нажатие клавиши требует полной отметки времени для обновления.