Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
 Аватар для extrimally
9 / 9 / 2
Регистрация: 22.09.2012
Сообщений: 212
MySQL

Сохранить две таблицы в DataGridView в базу MySql

23.02.2016, 08:19. Показов 1873. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет, форумчане! Есть две таблицы, которые успешно выводятся в DataGridView с помощью запроса MySql, но при сохранении возникает ошибка: "Динамическое создание SQL для нескольких базовых таблиц не поддерживается".
(поля i таблиц t1 и t2 ключевые)
C#
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
private MySqlDataAdapter dadapter;
private DataSet dset;
private BindingSource bs;
private void LoadData()
        {
            string connstring = @"Data Source=" + Properties.Settings.Default.dataS +
                "; port=" + Properties.Settings.Default.port +
                "; Initial Catalog=" + Properties.Settings.Default.catalog +
                "; User Id=" + Properties.Settings.Default.user +
                "; password=" + Properties.Settings.Default.password;
 
            dadapter = new MySqlDataAdapter(@"SELECT t1.i, t1.b, t2.i 
FROM t1 LEFT JOIN t2 ON t1.i = t2.i WHERE t1.b IS NOT NULL", connstring);
            dadapter.Fill(dset);
            bs.DataSource = dset.Tables[0].DefaultView;
            bindingNavigator1.BindingSource = bs;
            var cmd = new MySqlCommandBuilder(dadapter);
            dataGridView1.DataSource = bs;
        }
private void saveToolStripButton_Click(object sender, EventArgs e)
        {
            try
            {
                this.Validate();
                this.bs.EndEdit();
                this.dadapter.Update(this.dset.Tables[0]);
                this.dset.AcceptChanges();
                MessageBox.Show("Сохранено");
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("Ошибка сохранения: " + ex.Message);
            }
        }
private void button1_Click(object sender, EventArgs e)
{
LoadData();
}
Посоветовали в таких случаях использовать DataTable, кто-нибудь может подсказать как? Или без него, главное сохранить (хотя бы только таблицу t2). Желательно приведите код, буду признателен
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.02.2016, 08:19
Ответы с готовыми решениями:

Как сохранить изменения в DataGridView в базу данных?
Господа программисты. Подскажите, пожалуйста. Работаю на vb.net 2015 и sql server 2008. Делаю форму, на которой располагается DataGridView...

Как сохранить данные из DataGridView в базу данных Access?
Доброго времени суток. Есть форма, на которой DataGridView с загруженными данными из таблицы. Как сделать, чтобы по нажатию button данные...

Не могу сохранить данные в базу данных mysql
У меня есть объект DataGridView, в который я загружаю данные из базы данных,а после меняю данные в DataGridView. Как мне сохранить...

13
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
24.02.2016, 06:40
Цитата Сообщение от extrimally Посмотреть сообщение
Посоветовали в таких случаях использовать DataTable, кто-нибудь может подсказать как?
А тот, кто советовал, не сказал? Или он знает только то, что нужно использовать, а как использовать, не знает?
Что касается сабжа, то исключение у вас бьет MySqlCommandBuilder, потому что он подавился вашим запросом. Причина указана в исключении. Откажитесь от использования MySqlCommandBuilder'а в этом случае и создайте InsertCommand, UpdateCommand и DeleteCommand вручную для dadapter'а. Ну или пересмотрите ваш запрос. Среди ваших t1, t2, i, b я так и не понял, в чем смысл JOIN'ить в этом случае вторую таблицу...
0
 Аватар для extrimally
9 / 9 / 2
Регистрация: 22.09.2012
Сообщений: 212
24.02.2016, 09:51  [ТС]
Цитата Сообщение от kodv Посмотреть сообщение
Откажитесь от использования MySqlCommandBuilder'а в этом случае и создайте InsertCommand, UpdateCommand и DeleteCommand вручную для dadapter'а. Ну или пересмотрите ваш запрос. Среди ваших t1, t2, i, b я так и не понял, в чем смысл JOIN'ить в этом случае вторую таблицу...
Я это уже читал в других темах, на других форумал, в литературе. Слова мне не помогут, мне нужен код. На смысл JOIN'а не смотрите, я запрос переделаю, это просто пример
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
24.02.2016, 10:14
extrimally, Какой вам нужен код? Нельзя одновременно обновить более одной таблицы. Это факт.
0
 Аватар для extrimally
9 / 9 / 2
Регистрация: 22.09.2012
Сообщений: 212
24.02.2016, 10:15  [ТС]
Я уже несколько дней голову ломаю. Помогите с кодом в моем случае конкретно плиз. Как создать InsertCommand, UpdateCommand и DeleteCommand вручную ?
Цитата Сообщение от kodv Посмотреть сообщение
Нельзя одновременно обновить более одной таблицы. Это факт.
Как это нельзя? И что делать? Мне нужно! Я читал, что можно, просто не смог код подогнать под свою программу. Мне хотя бы вторую сохранить (две не надо)
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
24.02.2016, 10:28
extrimally, Я не совсем понимаю, чего вы хотите добиться? InsertCommand создается так:
C#
1
dadpter.InsertCommand = new MySqlCommand("INSERT INTO [Table] (Field1, Field2, ..., FieldN) VALUES (@Value1, @Value2, ..., @ValueN)", new MySqlConnection(connstring));
0
 Аватар для extrimally
9 / 9 / 2
Регистрация: 22.09.2012
Сообщений: 212
24.02.2016, 10:52  [ТС]
Цитата Сообщение от kodv Посмотреть сообщение
Я не совсем понимаю, чего вы хотите добиться
Попробую объяснить. Имеется множество таблиц с одинаковыми полями. Это таблицы за разные месяца и годы. Количество строк в таблицах везде одинаковое. Чтобы не создавать кучу таблиц я решил объединить их в одну со множеством строк. Я добавлю новое поле с названием месяца и года, чтобы можно было сделать MySql запрос и вывести только нужные мне строки. Но надо также вывести поля id и name, значения в строках у этих полей всегда будут одинаковыми, поэтому я создал отдельную таблицу с этими значениями (не буду же я забивать мою "длинную" таблицу этими значениями снова и снова, а вдруг потом нужно будет поменять значения поля name?). С этой целью я объединял эти таблицы в dataGridView, но сохранить мне нужно только ту "длинную", name и id естественно не надо, если что их в самом SQL потом изменю.
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
24.02.2016, 12:16
extrimally, В своей практике я предпочитаю в подобных случаях возвращать на клиент ид с справочника, который пользователю отображается в DataGridView через DataGridViewComboBoxColumn. К ComboBox цепляется справочник, который вы обозначалили как t2, Если операция не подразумевает редактирования, то можно поставить свойство ReadOnly = true, а DisplayStyle = Nothing, тогда визуально DataGridViewComboBox не будет отличаться от DataGridViewTextBox'а. Для запроса, в этом случае, будет одна базовая таблица, с которой проблем у всяких MySqlCommandBuilder'а не будет. Если же охота через JOIN, то запрос в вашем случае будет примерно такой:
SQL
1
INSERT INTO t1 (i, b t2i) SELECT @i, @b, t2.i FROM t2 WHERE t2.a = @t2a
1
 Аватар для extrimally
9 / 9 / 2
Регистрация: 22.09.2012
Сообщений: 212
24.02.2016, 13:20  [ТС]
Цитата Сообщение от kodv Посмотреть сообщение
В своей практике я предпочитаю в подобных случаях возвращать на клиент ид с справочника, который пользователю отображается в DataGridView через DataGridViewComboBoxColumn
Спасибо за идею, но это выпадающий список получится, а как сделать, чтобы таблица с id, name просто отображалсь слева в первых друх столбцах ? Ее брать из базы, а справа столбцы из моей длинной таблицы
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
25.02.2016, 04:31
Цитата Сообщение от extrimally Посмотреть сообщение
а как сделать, чтобы таблица с id, name просто отображалсь слева в первых друх столбцах ?
Я же все написал
Цитата Сообщение от kodv Посмотреть сообщение
поставить свойство ReadOnly = true, а DisplayStyle = Nothing, тогда визуально DataGridViewComboBox не будет отличаться от DataGridViewTextBox'а.
А если нужно редактировать эту строку, то, в общем случае, более правильно давать пользователю выбирать значение из списка.
1
 Аватар для extrimally
9 / 9 / 2
Регистрация: 22.09.2012
Сообщений: 212
25.02.2016, 12:34  [ТС]
Получилось добавить DataGridViewComboBoxColumn, выглядит как DataGridView, но что-то не могу задать значения. В гугле рылся, ничего не нашел (или не смог просто). Как добавить значения в мои две колонки ComboBoxColumn? Можно прям из программы, из БД не обязательно вытаскивать.
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
25.02.2016, 12:57
extrimally, Свой код покажите, или скриншот, с помощью которого вы создаете столбцы.
0
 Аватар для extrimally
9 / 9 / 2
Регистрация: 22.09.2012
Сообщений: 212
25.02.2016, 13:14  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
            DataGridViewComboBoxColumn dgvcbc = new DataGridViewComboBoxColumn();
            dgvcbc.ReadOnly = true;
            dgvcbc.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;
            dgvcbc.HeaderText = "Header1";
            dataGridView1.Columns.Add(dgvcbc);
            DataGridViewComboBoxColumn dgvcbc2 = new DataGridViewComboBoxColumn();
            dgvcbc2.ReadOnly = true;
            dgvcbc2.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;
            dgvcbc2.HeaderText = "Header2";
            dataGridView1.Columns.Add(dgvcbc2);
Пробовал через dataTable, но не вышло:
C#
1
2
3
4
5
            DataTable table = new DataTable();
            table.Columns.Add("par", typeof(string));
            table.Rows.Add(); table.Rows.Add();
            table.Rows[0][0] = "Value";
            dgvcbc.DataSource = table;
Ну а код основной таблицы не изменился, только запрос вот такой (потом его изменю, это для примера):
SQL
1
SELECT * FROM upravlenie
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
26.02.2016, 11:01
extrimally,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DataTable t2DataTable = new DataTable();
using(MySqlConnection mySqlConnection = new MySqlConnection(connstring))
using(MySqlCommand t2Command = new MySqlCommand("SELECT i, a FROM t2", mySqlConnection))
{
    mySqlConnection.Open();
    using(MySqlDataReader t2Reader = t2Command.ExecuteReader())
        t2DataTable.Load(t2Reader);
}
// ...
dgvcbc.DataSource = t2DataTable;
dgvcbc.DataPropertyName = "t2i"
dgvcbc.DisplayMember = "a"; // Поле, которое отображается
dgvcbc.ValueMember = "i"; // Поле, которое является ключом
// ...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.02.2016, 11:01
Помогаю со студенческими работами здесь

Как сохранить текст в базу данных mysql?
имеется условие на рандом, этот рандом выводится в alert как сохранить полученное значение в базу данных или отправить мне на почту,...

Не могу сохранить базу данных mysql management studio
Не могу сохранить базу данных mysql management studio.Кнопка сохранить выбранный элемент как... просто не горит . Может кто знает что...

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

Добавление записи из Datagridview в базу данных mysql
Друзья, хочу добавить данные с датагрида в базу данных но выдает ошибку ссылка на объект не указывает на экземпляр объекта, что я делаю не...

DataGridView все действия сохранить в базу, обновить после нажатия кнопки enter
Добрый день, я не понимаю принцип работы таблицы DataGridView с базой данных. Интересует момент сохранения всех действий. И обновить. Хотя...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru