使数据网格与 mysql 数据库保持同步

Posted

技术标签:

【中文标题】使数据网格与 mysql 数据库保持同步【英文标题】:Keeping a datagrid in sync with a mysql database 【发布时间】:2011-07-14 12:33:09 【问题描述】:

我正在 WPF 中试验数据绑定

我有这个绑定到 mysql 视图的数据网格,它将是只读的,但我希望它在对数据库进行更改时自动刷新。 在谷歌上找不到任何有用的东西,我不知道从哪里开始。

这是数据提供者类。

class ConDataProvider

    private MySqlDataAdapter adapter;
    private Data data;
    private DataTable table;

    public ConDataProvider(string query)
    
        data = new Data();
        table = new DataTable("con_FullGrid");
        adapter = data.getAdapter(query);
        adapter.Fill(table);
    
    public DataView GetDView()
    
            dv = new DataView();
            dv.Table = table;
            return dv;
    

以及窗口的 XAML

<Window x:Class="HelioWPF_Alpha01.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:local="clr-namespace:HelioWPF_Alpha01"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="676" Width="924" MinHeight="300" MinWidth="463" Background="x:Null">
<Window.Resources>
    <ObjectDataProvider x:Key="ConDataProvider" ObjectType="x:Type local:ConDataProvider">
        <ObjectDataProvider.ConstructorParameters>
            <sys:String>SELECT * FROM con_FullGrid</sys:String>
        </ObjectDataProvider.ConstructorParameters>
    </ObjectDataProvider>
    <ObjectDataProvider x:Key="btable" ObjectInstance="StaticResource ConDataProvider"
                        MethodName="GetDView"/>

</Window.Resources>
<Grid Name="mainGrid" DataContext="Binding Source=StaticResource btable" KeyDown="mainGrid_KeyDown" FlowDirection="LeftToRight" >
    <DataGrid AutoGenerateColumns="True" ItemsSource="Binding" Name="dataGrid1" FrozenColumnCount="20" RowHeight="25" Grid.ColumnSpan="4" ColumnWidth="*" MouseDoubleClick="dataGrid1_MouseDoubleClick" SelectionMode="Single" Grid.Row="2" Grid.Column="1" TabIndex="1" GotKeyboardFocus="dataGrid1_GotKeyboardFocus">
        <DataGrid.AlternatingRowBackground>
            <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5">
                <GradientStop Color="Black" Offset="0" />
                <GradientStop Color="#16436DF8" Offset="0" />
            </LinearGradientBrush>
        </DataGrid.AlternatingRowBackground></DataGrid>
</Grid>

我一直在做的是通过在后面的代码中重新初始化 ConDataProvider 类并在各种事件上重新绑定数据网格来伪装它。 但这是一个丑陋的黑客。 如果必须的话,我不介意重新设计整个东西。

Data 类只包含连接字符串和一些与数据库交互的方法。 你可以在这里看到它:http://pastebin.com/m9HLfwEQ

提前致谢。 希望能得到一些好的建议。

【问题讨论】:

不确定 MySql 但 Microsoft SQL 有 Service Broker,它有 Notification Services.. 【参考方案1】:

如果你连接一些Reactive Extensions怎么样。

你可以做的是创建一个每 X 秒轮询你的数据库的 observable。然后让你的 Observer 连接到那个 observable。在 Observer 的 OnNext 事件中,您可以将数据添加到网格中,或者重新绑定,等等。

本质上,您将创建位于数据库和应用程序之间的东西,用于侦听更改并将这些更改推送给您。

【讨论】:

谢谢,我必须调查一下。菜鸟问题:我可以让这个运行服务器端,只是观察数据库,然后如果有一些新数据而不是让客户端不断地从数据库中获取数据,然后向应用程序报告? 服务器端和数据库服务器一样吗?从来没听说过。至少不是原生的。您可以编写一个位于同一个盒子上的服务并通知您的客户端应用程序。但它不是 MySql 原生的。【参考方案2】:

每当数据库中的数据发生更改时,MySQL 都会在日志中附加信息。此功能可能需要开启,不确定是否默认开启。

http://dev.mysql.com/doc/refman/5.0/en/binary-log.html

有了这个,你可以在服务器端运行一个服务,它会监听 MySQL 表的变化,并在表更新时向客户端发送一个事件。

客户端需要实现代码,以便在从服务器接收此类事件时刷新网格。

要扫描 bin 日志以查找更改,可以使用 bin-log 实用程序。

http://dev.mysql.com/doc/refman/5.0/en/mysqlbinlog.html

如果数据量或事务量很高,我会使用这种方法而不是扫描表以查找数据更改。否则轮询数据库的方法应该可以正常工作。

【讨论】:

以上是关于使数据网格与 mysql 数据库保持同步的主要内容,如果未能解决你的问题,请参考以下文章

如何使 C# 枚举与数据库中的表保持同步

转载:使用canal让redis中的数据与mysql数据库中的保持同步

[access数据库同步]使Access数据库保持同步的思路分析

使用 Logstash 和 JDBC 确保 Elasticsearch 与关系型数据库保持同步

在 ActionScript 中刷新数据网格时保持选择

Mysql数据库的主从同步配置