代码之家  ›  专栏  ›  技术社区  ›  Max Eisenhardt

如果数据库表更新/插入,如何使windows C#控件自动更新?

  •  3
  • Max Eisenhardt  · 技术社区  · 15 年前

    我有一个listView WinForms-C,我已经绑定到一个数据库(MySQL)表,但我似乎不知道如何让listView在更改数据库表(更新/插入)时自动显示结果,而用户不必触发事件,例如按钮单击、计时器滴答声等。。。

    -唐纳德

    2 回复  |  直到 15 年前
        1
  •  1
  •   Pieter van Ginkel    15 年前

    SQL不支持将更改事件从数据库发送回客户端。

    电视上的事件 DataTable 不要从数据库发出更改信号。它们会向用户发出改变的信号 数据表 它本身

    如果要查看对实际数据库的更改,有两种选择:

    1. 如果您需要实时更改,另一种选择是使用消息服务。您可以实现WCF服务,在更改数据库时向其发送信号。然后,其他进程(包括您自己的进程)可以通过回调接口连接到此WCF服务,并在发生更改时接收这些更改。但是,只有当您完全控制对数据库的更改时,这才有效。

        2
  •  0
  •   Brad Christie    15 年前

    为了清楚起见,我知道SQL无法标记回更改,我的印象是,他们有一个库实现了他们绑定到的CRUD操作,并且有一些事件可用于标记所述更改。有了下面的评论,我现在可以做出更明智的决定

    版本2

    我建议创建一个计时器,正如上面Pieter所建议的那样,并轮询数据库中的更改。使用数据库中的某些值作为计数器,以了解何时需要从中获取更新(即,如果表中有主键,则继续检查 WHERE key > last_key_receieved )

    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);
        }
    }
    
    推荐文章