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

时间:2011-03-13 16:19:06

标签: c# mysql wpf data-binding

我在WPF中试验数据绑定

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

这是dataprovider类。

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类并在各种事件上重新绑定datagrid来伪装它。 但这是一个丑陋的黑客 如果必须的话,我不介意重新设计整个事情。

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

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

2 个答案:

答案 0 :(得分:1)

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

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

基本上,您将创建一个位于数据库和应用之间的内容,用于侦听更改并将这些更改推送给您。

答案 1 :(得分:0)

只要数据库中的数据发生变化,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

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