Синхронизация базы данных с базой данных MySQL - PullRequest
4 голосов
/ 13 марта 2011

Я экспериментирую с привязкой данных в WPF

У меня есть эта таблица данных, связанная с представлением mysql, она будет доступна только для чтения, но я бы хотела, чтобы она автоматически обновлялась при внесении изменений вбаза данных.
Не могу найти ничего полезного в Google, и я не знаю, с чего начать.

Это класс поставщика данных.

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

Заранее спасибо.
Надеюсь получить хорошие советы.

Ответы [ 2 ]

1 голос
/ 13 марта 2011

Как насчет, если вы подключите несколько Reactive Extensions .

Что вы можете сделать, это создать наблюдаемое, которое опрашивает вашу БД каждые X секунд.Затем подключите наблюдателя к этому наблюдаемому.В событии OnNext Observer вы можете добавить данные в свою сетку или выполнить повторную привязку, что угодно.

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

0 голосов
/ 14 марта 2011

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

Я бы использовал этот подход вместо сканирования таблицы на предмет изменений данных, если объем данных или количество транзакций велико.В противном случае подход опроса БД должен работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...