Как сохранить изменения datagrid в mysql
Перейти к содержимому

Как сохранить изменения datagrid в mysql

  • автор:

Как сохранить изменения datagrid в mysql

Данное руководство устарело. Актуальное руководство: по ADO.NET и работе с базами данных в .NET 6

Последнее обновление: 31.10.2015

Ранее мы рассмотрели, как удобно загружать данные в приложении Windows Forms в элемент DataGridView через DataSet. Теперь определим полнофункциональную форму, через которую мы сможем производить все стандартные CRUD операции в базе данных.

Итак, определим форму, на которой будет элемент DataGridView и три кнопки для добавления, удаления и сохранения изменений. Форма в итоге будет выглядеть примерно следующим образом:

DataSet и DataGridView

Код формы будет выглядеть следующим образом:

using System; using System.Data; using System.Windows.Forms; using System.Data.SqlClient; namespace AdoNetWinFormsApp < public partial class Form1 : Form < DataSet ds; SqlDataAdapter adapter; SqlCommandBuilder commandBuilder; string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True"; string sql = "SELECT * FROM Users"; public Form1() < InitializeComponent(); dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect; dataGridView1.AllowUserToAddRows = false; using (SqlConnection connection = new SqlConnection(connectionString)) < connection.Open(); adapter = new SqlDataAdapter(sql, connection); ds = new DataSet(); adapter.Fill(ds); dataGridView1.DataSource = ds.Tables[0]; // делаем недоступным столбец id для изменения dataGridView1.Columns["Id"].ReadOnly = true; >> // кнопка добавления private void addButton_Click(object sender, EventArgs e) < DataRow row = ds.Tables[0].NewRow(); // добавляем новую строку в DataTable ds.Tables[0].Rows.Add(row); >// кнопка удаления private void deleteButton_Click(object sender, EventArgs e) < // удаляем выделенные строки из dataGridView1 foreach(DataGridViewRow row in dataGridView1.SelectedRows) < dataGridView1.Rows.Remove(row); >> // кнопка сохранения private void saveButton_Click(object sender, EventArgs e) < using (SqlConnection connection = new SqlConnection(connectionString)) < connection.Open(); adapter = new SqlDataAdapter(sql, connection); commandBuilder = new SqlCommandBuilder(adapter); adapter.InsertCommand = new SqlCommand("sp_CreateUser", connection); adapter.InsertCommand.CommandType = CommandType.StoredProcedure; adapter.InsertCommand.Parameters.Add(new SqlParameter("@name", SqlDbType.NVarChar, 50, "Name")); adapter.InsertCommand.Parameters.Add(new SqlParameter("@age", SqlDbType.Int, 0, "Age")); SqlParameter parameter = adapter.InsertCommand.Parameters.Add("@Id", SqlDbType.Int, 0, "Id"); parameter.Direction = ParameterDirection.Output; adapter.Update(ds); >> > >

Здесь для добавления объекта мы будем обращаться к хранимой процедуре sp_CreateUser, которая была добавлена в базу данных в прошлой теме.

В конструкторе данные загружаются в DataSet, первая таблица которого устанавливается в качестве источника данных для dataGridView1:

dataGridView1.DataSource = ds.Tables[0];

Также в конструкторе устанавливается полное выделение строки и запрет на ручное добавление новых строк:

dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect; dataGridView1.AllowUserToAddRows = false;

В обработчике кнопки добавления создается новая строка, которая добавляется в таблицу объекта DataSet. И так как мы ранее установили привязку к источнику данных, то автоматически новая строка также будет добавляться и в dataGridView1:

private void addButton_Click(object sender, EventArgs e) < DataRow row = ds.Tables[0].NewRow(); // добавляем новую строку в DataTable ds.Tables[0].Rows.Add(row); >

В обработчике кнопки удаления удаляются выделенные строки в dataGridView1. Опять же в силу привязки к источнику данных будет также происходить удаление и из таблицы в DataSet:

private void deleteButton_Click(object sender, EventArgs e) < foreach(DataGridViewRow row in dataGridView1.SelectedRows) < dataGridView1.Rows.Remove(row); >>

Для обновления на не нужна никакая кнопка, так как мы можем нажать на любую ячейку таблицы (кроме заблокированного для изменения столбца Id) и изменить в ней данные. Однако сами по себе добавление новой строки, удаление строк, изменение ячеек ни как автоматически не отразятся на базе данных. И чтобы бд синхронизировалась, пользователю надо будет нажать на кнопку сохранения, обработчик которой выглядит следующим образом:

private void saveButton_Click(object sender, EventArgs e) < using (SqlConnection connection = new SqlConnection(connectionString)) < connection.Open(); adapter = new SqlDataAdapter(sql, connection); commandBuilder = new SqlCommandBuilder(adapter); adapter.InsertCommand = new SqlCommand("sp_CreateUser", connection); adapter.InsertCommand.CommandType = CommandType.StoredProcedure; adapter.InsertCommand.Parameters.Add(new SqlParameter("@name", SqlDbType.NVarChar, 50, "Name")); adapter.InsertCommand.Parameters.Add(new SqlParameter("@age", SqlDbType.Int, 0, "Age")); SqlParameter parameter = adapter.InsertCommand.Parameters.Add("@Id", SqlDbType.Int, 0, "Id"); parameter.Direction = ParameterDirection.Output; adapter.Update(ds); >>

Как в прошлой теме здесь устанавливается у адаптера команда на добавление InsertCommand и затем вызывается метод Update() . В итоге мы можем добавить несколько строк, удалить, изменить, и потом один раз мы нажмем на кнопку, и все изменения будут применены к базе данных.

Kак сохранить изменения в DataGrid VC#?

Доброй ночи! Вытащил из базы данные в колоночку. Все круто отображается. Но после редактирования — не сохраняется естественно. Как на примере моего кода реализовать что-то вроде DbDataAdapter.Update (DataTable) чтобы поставить кнопочку ЗАСЕЙВИТЬ и естественно все изменения, добавления и удаляния сейвились в MySQL. Вот код:

private DataTable GetCats() < DataTable dt = new DataTable(); MySqlConnectionStringBuilder mysqlCSB; mysqlCSB = new MySqlConnectionStringBuilder(); mysqlCSB.Server = textBox1.Text; mysqlCSB.Database = textBox2.Text; mysqlCSB.UserID = textBox3.Text; mysqlCSB.Password = textBox4.Text; string queryString = @"SELECT blablabla FROM blablabla WHERE blabla IN (SELECT blabla FROM blablabla WHERE blablabla='blablabla')"; using (MySqlConnection con = new MySqlConnection()) < con.ConnectionString = mysqlCSB.ConnectionString; MySqlCommand com = new MySqlCommand(queryString, con); try < con.Open(); using (MySqlDataReader dr = com.ExecuteReader()) < if (dr.HasRows) < dt.Load(dr); >> > catch (Exception ex) < MessageBox.Show(ex.Message); >> return dt; >
  • Вопрос задан более трёх лет назад
  • 488 просмотров

Как добавить данные в базу MySQL из DataGrid C#?

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

private void dtGrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)

Отслеживать
задан 4 ноя 2018 в 18:40
21 1 1 серебряный знак 2 2 бронзовых знака
4 ноя 2018 в 19:45
посмотрите здесь: ru.stackoverflow.com/a/900352/261244
4 ноя 2018 в 20:05
@Andrew, там под Windows Forms
5 ноя 2018 в 9:24

@ЕвгенийКрасильников Если вы не можете адаптировать код с WinForms под WPF, то может вам стоит начать изучение языка с чего то более простого?

5 ноя 2018 в 9:37

@ЕвгенийКрасильников EvgeniyZ прав. Адаптация кода с WinForms на WPF это просто на столько базовый скил, что тебе явно нужно еще изучать язык перед тем, как делать подобные задачи как в вопросе. Ответ я подсказал, но с адаптацией кода игратся за тебя я чет не очень хочу)

5 ноя 2018 в 10:28

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Проблема в том, что вы в коде никак не задействуете DataGrid. Вы создаете пустой DataSet, заполняете его данными из базы, и потом эти же самые данные записываете назад в базу. Правильно нужно делать так:

Допустим, мы хотим сделать DataGrid, привязанную к DataTable. Сразу в конструкторе окна создадим DbDataAdapter и DataTable (нет необходимости это делать при каждом обновлении, так как структура данных и запросы то не меняются), и сохраним их в полях класса окна.

DbDataAdapter adapter; DataTable dt; public MainWindow() < InitializeComponent(); MySqlConnection conn = DBUtils.GetDBConnection(); string table = "brands"; string sql = "SELECT * FROM "+table; adapter = new MySqlDataAdapter(sql, conn); conn.Open(); MySqlCommandBuilder myCommandBuilder = new MySqlCommandBuilder(adapter as MySqlDataAdapter); adapter.InsertCommand = myCommandBuilder.GetInsertCommand(); adapter.UpdateCommand = myCommandBuilder.GetUpdateCommand(); adapter.DeleteCommand = myCommandBuilder.GetDeleteCommand(); dt = new DataTable(); adapter.Fill(dt); //загрузка данных datagrid.ItemsSource = dt.DefaultView; //привязка к DataGrid >

Теперь, когда нужно сохранить данные (я не рекомендую сохранять при каждом изменении строки, так как будет слишком много запросов в базу, лучше создать кнопку «Сохранить»), выполним Update на той же DataTable.

private void ButtonSave_Click(object sender, RoutedEventArgs e)

Сохранение из DataGridView в MySQL

Author24 — интернет-сервис помощи студентам

Сохранение массива datagridview в базу MySQL
Есть заполняющаяся таблица datagridviwe. c 5 столбцами код,названия,количество,ценаза1,оплата.

Сохранение изменений таблиц MySQL из DataGridView
Здравствуйте, уважаемые коллеги! На форме имеется TabControl. При помощи нехитрых манипуляций в.

Сохранение DataGridView
Здравствуйте, уважаемые форумчане. Имею приложение на Windows Forms, в которой имеется.

сохранение DataGridView
Здравствуйте. Помогите пожалуйста решить Такой момент: допустим есть у нас таблица с ней.

17 / 17 / 17
Регистрация: 31.10.2014
Сообщений: 79
Что именно нужно? Какой-то определенный элемент из дата грида вставить в БД?
Регистрация: 07.11.2013
Сообщений: 156

ЦитатаСообщение от bublegums Посмотреть сообщение

Что именно нужно? Какой-то определенный элемент из дата грида вставить в БД?

Надо сохранить все содержание с DataGridView в таблицу в БД

Добавлено через 11 часов 32 минуты
чтение делаю так:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
//. connStr = "Database="+dbName+";Data Source=" + serverName + ";User + userName + ";Password=" + password; conn = new MySqlConnection(connStr); MySqlDataAdapter MyData = new MySqlDataAdapter(); strTable = _table; string sql = "SELECT * FROM " + strTable; // Строка запроса MyData.SelectCommand = new MySqlCommand(sql, conn); conn.Open(); DataTable table = new DataTable(); MyData.Fill(table); BindingSource bsource = new BindingSource(); bsource.DataSource = table; dbDataGridView.DataSource = bsource; conn.Close(); //. 

А вот как сделать запись в БД в таблицу всего содержимого DataGridView не пойму, помогите, пожалуйста.

Регистрация: 12.12.2015
Сообщений: 38

javavirys, Тут все просто на самом деле:

1 2 3
//фиксируем измененные данные bsource.EndEdit(); MyData.AcceptChanges();

Только объявление DataTable и BindingSource вынесите за пределы процедуры

Добавлено через 14 минут
javavirys, Забыл добавить между EndEdit() и AcceptChanges()

MyData.Update(table)

Регистрация: 07.11.2013
Сообщений: 156
dimkadv2,
Кликните здесь для просмотра всего текста

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
using System; using System.Drawing; using System.Windows.Forms; using MySql.Data.MySqlClient; using System.Data; namespace Kr_Visual_IDE { public partial class Form1 : Form { private DataGridView dbDataGridView = new DataGridView(); ConnectionForm auth; MySqlConnection conn; MySqlDataAdapter MyData; DataTable table; BindingSource bsource; string connStr; string strTable; public Form1() { InitializeComponent(); SetupDataGridView(); auth = new ConnectionForm(this); } private void SetupDataGridView() { Controls.Add(dbDataGridView); dbDataGridView.ColumnHeadersDefaultCellStyle.BackColor = Color.Navy; dbDataGridView.ColumnHeadersDefaultCellStyle.ForeColor = Color.White; dbDataGridView.ColumnHeadersDefaultCellStyle.Font = new Font(dbDataGridView.Font, FontStyle.Bold); dbDataGridView.Name = "dbDataGridView"; dbDataGridView.Location = new Point(8, 8); dbDataGridView.Size = new Size(500, 250); dbDataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders; dbDataGridView.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single; dbDataGridView.CellBorderStyle = DataGridViewCellBorderStyle.Single; dbDataGridView.GridColor = Color.Black; dbDataGridView.RowHeadersVisible = false; dbDataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; dbDataGridView.MultiSelect = false; //dbDataGridView.Dock = DockStyle.Fill; Form1_Resize(null, null); } public void LoadMySql(string serverName, string userName, string dbName, int port, string password, string _table) { connStr = "Database="+dbName+";Data Source=" + serverName + ";User + userName + ";Password=" + password; conn = new MySqlConnection(connStr); MyData = new MySqlDataAdapter(); strTable = _table; string sql = "SELECT * FROM " + strTable; // Строка запроса MyData.SelectCommand = new MySqlCommand(sql, conn); conn.Open(); table = new DataTable(); MyData.Fill(table); bsource = new BindingSource(); bsource.DataSource = table; UpdateGrid(bsource); conn.Close(); } public void UpdateGrid(BindingSource bsource) { dbDataGridView.DataSource = bsource; dbDataGridView.AutoResizeColumnHeadersHeight(); } private void connectToolStripMenuItem_Click(object sender, EventArgs e) { auth.ShowDialog(this); } private void disconnectToolStripMenuItem_Click(object sender, EventArgs e) { try { conn.Close(); dbDataGridView.Columns.Clear(); }catch(Exception ex){ MessageBox.Show("Error: " + ex.Message); } } private void Form1_Resize(object sender, EventArgs e) { dbDataGridView.Left = 1; dbDataGridView.Top = 25; dbDataGridView.Width = this.Width - 20; dbDataGridView.Height = this.Height - 32; } private void saveToolStripMenuItem_Click(object sender, EventArgs e) { bsource.EndEdit(); MyData.Update(table); table.AcceptChanges(); } } }

Возникает ошибка в «private void saveToolStripMenuItem_Click(object sender, EventArgs e)»:

Кликните здесь для просмотра всего текста

Необработанное исключение типа «System.InvalidOperationException» произошло в System.Data.dll

Дополнительные сведения: Для элемента Update требуется действительный InsertCommand при передаче коллекции DataRow с новыми строками.

Что я не так делаю?

Добавлено через 12 минут
Что за InsertCommand в ошибке?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *