Двусторонняя привязка данных с помощью DataSet и ADO.NET - PullRequest
1 голос
/ 20 января 2011

Я только начинаю изучать WPF и его возможности в отношении связывания данных.

Я получил образец файла базы данных Access и поместил его содержимое в DataSet.Затем я связываю DataSet с сеткой (двустороннее связывание).Чего я хочу добиться, так это обновить основную запись базы данных измененного DataSet -Item.Это мой код:

public partial class MainWindow : Window
{
    DataSet sampleDataSet;
    OleDbDataAdapter adapter;

    public MainWindow()
    {
        InitializeComponent();
        InitializeDB();
    }

    private void InitializeDB()
    {
        string mdbFile = "./test.mdb";
        string connString = string.Format(
            "Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}", mdbFile);
        OleDbConnection conn = new OleDbConnection(connString);
        adapter = new OleDbDataAdapter("SELECT * FROM Player;", conn);

        // ----------------------
        // **EDIT** inserted update command

        OleDbCommand cmd = new OleDbCommand("UPDATE Player SET Name = @Name " + 
                       "WHERE ID = @ID", conn);

        cmd.Parameters.Add("@Name", OleDbType.VarChar, 40, "Name");
        cmd.Parameters.Add("@ID", OleDbType.Char, 5, "ID");

        // set the update command
        adapter.UpdateCommand = cmd;

        // **End of EDIT**
        // ----------------------

        sampleDataSet = new DataSet("Player Table");
        adapter.Fill(sampleDataSet, "Player");

        data1.DataContext = sampleDataSet;
    }

    private void data1_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
    {            
        if (e.EditAction == DataGridEditAction.Commit)
        {
            adapter.Update(sampleDataSet, "Player");
        }
    }

    // Edit Comment April, 14th - Begin
    private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        //sampleDataSet.AcceptChanges();
        adapter.Update(sampleDataSet, "Player"); // Calling update again fixes it, but why?
    }
    // Edit Comment April, 14th - End
}

Мой XAML выглядит так:

<Window x:Class="AdoTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <DataGrid Name="data1" AutoGenerateColumns="True" ItemsSource="{Binding Mode=TwoWay, Path=Player}" CellEditEnding="data1_CellEditEnding" />
</Grid> 

Каков подход, чтобы фактически сохранить измененные значения в сетке дофайл базы данных?

1 Ответ

1 голос
/ 20 января 2011

Используйте метод обновления DataAdapter.Для этого вам потребуется установить свойства InsertMethod, UpdateMethod и DeleteMethod с помощью команд, которые выполняют фактические операции вставки, обновления и удаления.Вы также можете использовать System.Data.OleDb.OleDbCommandBuilder , чтобы сгенерировать запросы для вас, пока выборка попадает в одну таблицу (включая ее первичный ключ или хотя бы один уникальный столбец) Смотритетоже

Еще один способ использовать структуру сущностей и генерировать запросы для вас.

РЕДАКТИРОВАТЬ , если подумать, какой у вас вопрос?Вы уже делаете это (за исключением установки команд обновления, вставки и удаления.)

Посмотрите здесь , чтобы узнать, как синхронизировать базу данных с набором данных

...