Как обновить базу данных MySql из DataGrid на C #? - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь обновить базу данных MySQL из DataGrid, но она не работает. Добавленных данных нет в базе данных, и нет ошибок, почему это происходит. Я пытаюсь решить эту проблему уже несколько дней.

private void dtGrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
        {    
        MySqlConnection conn = DBUtils.GetDBConnection();
        string table = "brands";
        string sql = "SELECT * FROM "+table;
        MySqlDataAdapter myDataAdapter = new MySqlDataAdapter(sql, conn);
        conn.Open();
        MySqlCommandBuilder myCommandBuilder = new MySqlCommandBuilder(myDataAdapter);
        myDataAdapter.InsertCommand = myCommandBuilder.GetInsertCommand();
        myDataAdapter.UpdateCommand = myCommandBuilder.GetUpdateCommand();
        myDataAdapter.DeleteCommand = myCommandBuilder.GetDeleteCommand();
        DataSet myDataSet = new DataSet();
        myDataAdapter.Fill(myDataSet, table);
        myDataAdapter.AcceptChangesDuringUpdate = true;
        myDataAdapter.Update(myDataSet, table);
        conn.Close();
    }

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

@ Саймон, я сделал по-другому, на данный момент он вставляет все значения из dtGrid, а не только новые, возможно я не правильно делюсь. Для заполнения dbGrid:

        public MainWindow()
    {
        InitializeComponent();
        /*string sql = "SELECT * FROM brands";*/
        MySqlConnection conn = DBUtils.GetDBConnection();
        MySqlCommand cmd = new MySqlCommand("select * from brands", conn);
        conn.Open();
        DataTable dt = new DataTable();
        dt.Load(cmd.ExecuteReader());
        conn.Close();
        dtGrid.ItemsSource = dt.DefaultView;
    }

Для вставки новых предметов

        private void Insert_Click(object sender, RoutedEventArgs e)
    {
        MySqlConnection conn = DBUtils.GetDBConnection();
        string table = "brands";
        string sql = "SELECT * FROM " + table;
        MySqlDataAdapter myDataAdapter = new MySqlDataAdapter(sql, conn);
        conn.Open();
        MySqlCommandBuilder myCommandBuilder = new MySqlCommandBuilder(myDataAdapter);
        DataSet myDataSet = new DataSet();
        DataTable dt = new DataTable();
        DataSet ds = new DataSet();
        dt = ((DataView)dtGrid.ItemsSource).ToTable() as DataTable;
        ds.Tables.Add(dt);
        myDataAdapter.InsertCommand = myCommandBuilder.GetInsertCommand();
        myDataAdapter.UpdateCommand = myCommandBuilder.GetUpdateCommand();
        myDataAdapter.DeleteCommand = myCommandBuilder.GetDeleteCommand();
        myDataAdapter.Fill(ds, table);
        myDataAdapter.AcceptChangesDuringUpdate = true;
        myDataAdapter.Update(ds, table);
    }

1007 * XAML *

<Window x:Class="TechD.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="TechDep" Height="390" Width="902">
<Grid>
    <TabControl Height="310" HorizontalAlignment="Left" Margin="-1,-1,0,0" Name="tabControl1" VerticalAlignment="Top" Width="763">
        <TabItem Header="Brands" Name="tabBrands">
            <DataGrid AutoGenerateColumns="True" Height="280" Name="dtGrid" Width="750" CanUserAddRows="True" ItemsSource="{Binding}" RowEditEnding="dtGrid_RowEditEnding" />
        </TabItem>
        <TabItem Header="Later" Name="tabItem2">

        </TabItem>
    </TabControl>
    <Button Content="Insert" Height="23" HorizontalAlignment="Left" Margin="774,21,0,0" Name="Insert" VerticalAlignment="Top" Width="90" Click="Insert_Click" />
    <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="774,50,0,0" Name="button2" VerticalAlignment="Top" Width="90" />
    <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="774,79,0,0" Name="button3" VerticalAlignment="Top" Width="90" />
    <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="774,108,0,0" Name="button4" VerticalAlignment="Top" Width="90" />
</Grid>

0 голосов
/ 06 ноября 2018

@ Евгений

вот так:

DataTable dt = new DataTable();
DataSet ds = new DataSet();
dt = ((DataView)dtGrid.ItemsSource).ToTable() as DataTable;
ds.Tables.Add(dt);

и затем снова заполнить его

myDataAdapter.Fill(ds, table);

Вы создаете новую таблицу данных, а затем добавляете в нее существующую таблицу данных. Вот почему все строки добавляются снова.

Попробуйте изменить код на. XAML:

<Grid>
    <TabControl Height="310" HorizontalAlignment="Left" Margin="-1,-1,0,0" Name="tabControl1" VerticalAlignment="Top" Width="763">
        <TabItem Header="Brands" Name="tabBrands">
            <DataGrid ItemsSource="{Binding}" Name="dtGrid" Height="280" Width="750" BeginningEdit="dtGrid_BeginningEdit" RowEditEnding="dtGrid_RowEditEnding" AutoGenerateColumns="True" AutoGeneratingColumn="dtGrid_AutoGeneratingColumn" />               
        </TabItem>
        <TabItem Header="Later" Name="tabItem2">

        </TabItem>
    </TabControl>

</Grid>

C #

public partial class MainWindow : Window
{

    private MySqlDataAdapter myDataAdapter;        
    private DataSet myDataSet;
    private MySqlCommandBuilder myBuilder;
    private MySqlConnection myConn = DBUtils.GetDBConnection();

    public MainWindow()
    {
        InitializeComponent();
        myConn.Open();
        myDataAdapter = new MySqlDataAdapter {SelectCommand=new MySqlCommand() {Connection=myConn, CommandText= "SELECT * FROM brands" } };
        myDataSet = new DataSet();
        myDataAdapter.Fill(myDataSet, "brands");           
        dtGrid.DataContext = myDataSet.Tables["brands"].DefaultView;
    }

    private void dtGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
    {
        myBuilder  = new MySqlCommandBuilder(myDataAdapter);
        DataRowView myDRV = (DataRowView)dtGrid.SelectedItem;
        myDRV.BeginEdit();
    }

    private void dtGrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
    {
        DataRowView myDRV = (DataRowView)dtGrid.SelectedItem;
        myDRV.EndEdit();
        myDataAdapter.UpdateCommand = myBuilder.GetUpdateCommand();
        myDataAdapter.Update(myDataSet, "brands");
    }

    private void dtGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        var tc = e.Column as System.Windows.Controls.DataGridTextColumn;
        var b = tc.Binding as System.Windows.Data.Binding;

        b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
        b.ValidatesOnDataErrors = true;
        b.NotifyOnValidationError = true;
    }

}

при этом теряются кнопки, но теперь вы можете редактировать и добавлять строки без необходимости использования кнопок. Чтобы добавить строку, перейдите к пустой строке внизу DataGrid.

0 голосов
/ 05 ноября 2018

Похоже, вы запускаете этот код после того, как пользователь уже внес правку под именем "RowEditEnding".

Так что я думаю, что проблема в том, что вы создаете MySqlCommandBuilder только после того, как редактирование было сделано.

Сначала необходимо создать MySqlCommandBuilder, затем внести изменения, а затем получить команду обновления / вставки / удаления.

например. что-то вроде следующего (извините в VB, но вы понимаете суть):

Using NotesDS As New DataSet
        Using NotesDA As New SqlDataAdapter With {.SelectCommand = New SqlCommand With {.Connection = SQLDBConnection, .CommandText = "SELECT * FROM Notes WHERE ID = " & ID}}
            NotesDA.Fill(NotesDS, "Notes")
            Using NotesDV As New DataView(NotesDS.Tables("Notes"))
                Using NoteBuilder As New SqlCommandBuilder(NotesDA) With {.QuotePrefix = "[", .QuoteSuffix = "]"}                        
                    If NotesDV.Count = 1 Then                             
                        Dim NoteDRV As DataRowView = NotesDV(0)
                        NoteDRV.BeginEdit()
                        NoteDRV.Item("UserName") = UserName
                        NoteDRV.Item("Note") = Note
                        NoteDRV.Item("NoteDate") = NoteDate
                        NoteDRV.Item("CompanyCode") = CompanyCode
                        NoteDRV.EndEdit()
                        NotesDA.UpdateCommand = NoteBuilder.GetUpdateCommand
                        NotesDA.Update(NotesDS, "Notes")
                    End If
                End Using
            End Using
        End Using
    End Using

Редактировать

@ Евгений, с чем связан ваш DataGrid? Предположительно, вы устанавливаете DataView как DataContext?

Если это так, тогда вы будете использовать DataAdapter для заполнения DataView при загрузке страницы? Это DataAdapter, с которым нужно инициализировать MySqlCommandBuilder.

Попробуйте следующее:

  • объявляет вас DataAdapter, DataSet и DataView в верхней части вашей страницы.
  • Используйте обработчик BeginningEdit вашего dtGrid для инициализации вашего MySqlCommandBuilder на объявленном DataAdapter
  • Используйте RowEditEnding для запуска команды DataAdapter.Update

например. (Я использую SQL, но MySQL работает так же, насколько мне известно)

using System.Windows;
using System.Windows.Controls;    
using System.Data;
using System.Data.SqlClient;

namespace testApp
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private SqlDataAdapter myDataAdapter;
        private DataView myDataView;
        private DataSet myDataSet;
        private SqlCommandBuilder myBuilder;
        private SqlConnection myConn = new SqlConnection("CONNECTIONSTRING");
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            myConn.Open();
            myDataAdapter = new SqlDataAdapter {SelectCommand=new SqlCommand() {Connection=myConn, CommandText="SELECT MINumber, CompanyName FROM EIncCompanies WHERE CompanyName LIKE 'Test%'" } };
            myDataSet = new DataSet();
            myDataAdapter.Fill(myDataSet, "EIncCompanies");
            myDataView = new DataView(myDataSet.Tables["EIncCompanies"]);
            dtGrid.DataContext = myDataView;
        }

        private void dtGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
        {
            myBuilder  = new SqlCommandBuilder(myDataAdapter) { QuotePrefix="[", QuoteSuffix="]"};
            DataRowView myDRV = (DataRowView)dtGrid.SelectedItem;
            myDRV.BeginEdit();
        }

        private void dtGrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
        {
            DataRowView myDRV = (DataRowView)dtGrid.SelectedItem;
            myDRV.EndEdit();
            myDataAdapter.UpdateCommand = myBuilder.GetUpdateCommand();
            myDataAdapter.Update(myDataSet, "EIncCompanies");
        }

    }
}

Я также установил Mode=TwoWay, UpdateSourceTrigger=PropertyChanged на привязку в DataGrid.

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