none
WPF + MS SQL Server обновление БД из DataGrid RRS feed

  • Вопрос

  • Добрый день,

    Подскажите пожалуйста, как можно реализовать редактирование данных в DataGrid  , и записать изменения в базу MS SQL Server при завершении редактирования ячейки DataGrid? Буду признателен за пример.


    • Изменено LDN_Kyiv 27 марта 2019 г. 15:44
    27 марта 2019 г. 15:42

Ответы

  • Посмотрите, например, это руководство: https://docs.microsoft.com/en-us/ef/ef6/fundamentals/databinding/wpf

    Спасибо, посмотрел, полезная инфо, но для моего проекта не совсем подходит. И много "танцев с бубном" - это мое личное мнение.

    Нашел более элегантный способ представить данные из БД в DataGrid с возможностью редактирования и внесения этих правок в БД.

    Вместо DataTable использовал DataSet для представления данных в гриде.

    string connectionString = @"DataSource=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True"; string sql = "SELECT * FROM Users"; using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); // Создаем объект DataAdapter SqlDataAdapter adapter = new SqlDataAdapter(sql, connection); // Создаем объект Dataset DataSet ds = new DataSet(); // Заполняем Dataset adapter.Fill(ds); // Отображаем данные myDataGrid.ItemsSource = ds.Tables[0].DefaultView;

    Для модификации данных в БД в соответствии с изменениями в DataSet SqlDataAdapter использует команды InsertCommandUpdateCommand и DeleteCommand - то что и мне требовалось.

    Мы можем сами определить для этих команд sql-выражения, либо мы можем воспользоваться классом SqlCommandBuilder, который позволяет автоматически сгенерировать нужные выражения. Я воспользовался данным класом.

     // создаем объект SqlCommandBuilder
            SqlCommandBuilder commandBuilder = new SqlCommandBuilder(adapter);
    
            // заново получаем данные из БД
            adapter.Update(ds);
          
            // очищаем полностью DataSet
            ds.Clear();
    
            // перезагружаем данные
            adapter.Fill(ds);
           
           // отображаем обновленную таблицу
    
       myDataGrid.ItemsSource = ds.Tables[0].DefaultView;

    Правки в таблице можем обновлять или нажатием кнопки или по завершению редактирования ячейки, или другими событиями, которые будут на гриде.

    Моей целью было - обновление  данных таблице без использования button-ов, по типу Excel, только с автоматическим обновлением информации в БД.




    • Помечено в качестве ответа LDN_Kyiv 4 апреля 2019 г. 9:42
    4 апреля 2019 г. 9:40

Все ответы

  • Посмотрите, например, это руководство: https://docs.microsoft.com/en-us/ef/ef6/fundamentals/databinding/wpf
    28 марта 2019 г. 5:52
  • Посмотрите, например, это руководство: https://docs.microsoft.com/en-us/ef/ef6/fundamentals/databinding/wpf

    Спасибо, посмотрел, полезная инфо, но для моего проекта не совсем подходит. И много "танцев с бубном" - это мое личное мнение.

    Нашел более элегантный способ представить данные из БД в DataGrid с возможностью редактирования и внесения этих правок в БД.

    Вместо DataTable использовал DataSet для представления данных в гриде.

    string connectionString = @"DataSource=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True"; string sql = "SELECT * FROM Users"; using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); // Создаем объект DataAdapter SqlDataAdapter adapter = new SqlDataAdapter(sql, connection); // Создаем объект Dataset DataSet ds = new DataSet(); // Заполняем Dataset adapter.Fill(ds); // Отображаем данные myDataGrid.ItemsSource = ds.Tables[0].DefaultView;

    Для модификации данных в БД в соответствии с изменениями в DataSet SqlDataAdapter использует команды InsertCommandUpdateCommand и DeleteCommand - то что и мне требовалось.

    Мы можем сами определить для этих команд sql-выражения, либо мы можем воспользоваться классом SqlCommandBuilder, который позволяет автоматически сгенерировать нужные выражения. Я воспользовался данным класом.

     // создаем объект SqlCommandBuilder
            SqlCommandBuilder commandBuilder = new SqlCommandBuilder(adapter);
    
            // заново получаем данные из БД
            adapter.Update(ds);
          
            // очищаем полностью DataSet
            ds.Clear();
    
            // перезагружаем данные
            adapter.Fill(ds);
           
           // отображаем обновленную таблицу
    
       myDataGrid.ItemsSource = ds.Tables[0].DefaultView;

    Правки в таблице можем обновлять или нажатием кнопки или по завершению редактирования ячейки, или другими событиями, которые будут на гриде.

    Моей целью было - обновление  данных таблице без использования button-ов, по типу Excel, только с автоматическим обновлением информации в БД.




    • Помечено в качестве ответа LDN_Kyiv 4 апреля 2019 г. 9:42
    4 апреля 2019 г. 9:40