Как получить элемент управления Windows C # для автоматического обновления, если таблица базы данных обновляется / вставляется? - PullRequest
3 голосов
/ 22 ноября 2010

У меня есть listView WinForms-C #, который я связал с таблицей базы данных (MySQL), но я не могу понять, как заставить listView автоматически отображать результаты, когда вносятся изменения в таблицу базы данных (обновление / insert) без необходимости запуска события, например, button_click, timer_tick и т. д ...

Может кто-нибудь, пожалуйста, укажите мне в правильном направлении. Любые советы / решения будут с благодарностью!

Спасибо, -Donald

Ответы [ 2 ]

1 голос
/ 22 ноября 2010

SQL не поддерживает отправку событий изменения обратно из базы данных клиенту.

События на DataTable не сигнализируют об изменениях из базы данных. Они сигнализируют об изменениях самого DataTable.

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

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

  2. Если вам требуются изменения в реальном времени, альтернативой может быть служба обмена сообщениями. Вы можете реализовать службу WCF, которой вы отправляете сигнал при изменении базы данных. Затем другие процессы (включая ваш собственный) могут подключиться к этой службе WCF с помощью интерфейса обратного вызова и получать эти изменения, когда они происходят. Однако это работает, только если у вас есть полный контроль над изменениями в базе данных.

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

0 голосов
/ 22 ноября 2010

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

Для ясности, я знаю, что у SQL нет способа отменить изменение, у меня сложилось впечатление, что у них есть библиотека, в которой реализованы операции CRUD, к которым они привязаны, и есть события, доступные для флаг сказал изменения. Получив комментарий ниже, я могу принять более обоснованное решение

РЕДАКТИРОВАТЬ Версия 2

Я бы предложил создать таймер, как предложил Питер, и опросить базу данных на предмет изменений. Используйте какое-либо значение в базе данных в качестве счетчика, чтобы знать, когда вам нужно получать обновления (т. Е. Если в таблице есть первичный ключ, продолжайте проверять WHERE key > last_key_receieved)

Кроме того, поскольку вы будете работать в другом потоке, вам нужно будет создать метод, который будет безопасно обновлять пользовательский интерфейс. В зависимости от того, сколько столбцов у вас в listView, прототип будет отличаться, но предпосылка та же:

Timer updateScoresTimer = new Timer();
updateScoresTimer.Tick += delegate
{
    // 1. grab the database info
    // 2. filter for post-worthy changes
    // 3. iterate over changes, passing the UI info to AddScore(...)
};
updateScoresTimer.Interval = 30000;
updateScoresTimer.Start();

public delegate void AddScoreHandler(String arg1, String arg2, String arg3);
public void AddScore(String arg1, String arg2, String arg3)
{
    if (this.listView1.InvokeRequired)
        this.BeginInvoke(new AddScoreHandler(this.AddScore), new object[]{ arg1, arg2, arg3 });
    else
    {
        ListViewItem lvi = new ListViewItem(arg1);
        lvi.SubItems.AddRange(new string[]{ arg2, arg3 });
        this.listView1.Items.Add(lvi);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...