Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
extrimally
6 / 6 / 2
Регистрация: 22.09.2012
Сообщений: 212
1

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

23.02.2016, 08:19. Просмотров 731. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2016, 08:19
Ответы с готовыми решениями:

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

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

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

Две таблицы SQL в один datagridview
Есть две связанные таблицы. Необходимо вывести столбцы связанных таблиц в один datagridview. ...

Редактирование таблицы MySQL через DataGridView
Всем доброго времени суток! У меня есть БД MySQL, данные в одной из таблиц мне нужно добавлять,...

13
kodv
1425 / 1098 / 344
Регистрация: 11.04.2011
Сообщений: 2,606
Завершенные тесты: 1
24.02.2016, 06:40 2
Цитата Сообщение от extrimally Посмотреть сообщение
Посоветовали в таких случаях использовать DataTable, кто-нибудь может подсказать как?
А тот, кто советовал, не сказал? Или он знает только то, что нужно использовать, а как использовать, не знает?
Что касается сабжа, то исключение у вас бьет MySqlCommandBuilder, потому что он подавился вашим запросом. Причина указана в исключении. Откажитесь от использования MySqlCommandBuilder'а в этом случае и создайте InsertCommand, UpdateCommand и DeleteCommand вручную для dadapter'а. Ну или пересмотрите ваш запрос. Среди ваших t1, t2, i, b я так и не понял, в чем смысл JOIN'ить в этом случае вторую таблицу...
0
extrimally
6 / 6 / 2
Регистрация: 22.09.2012
Сообщений: 212
24.02.2016, 09:51  [ТС] 3
Цитата Сообщение от kodv Посмотреть сообщение
Откажитесь от использования MySqlCommandBuilder'а в этом случае и создайте InsertCommand, UpdateCommand и DeleteCommand вручную для dadapter'а. Ну или пересмотрите ваш запрос. Среди ваших t1, t2, i, b я так и не понял, в чем смысл JOIN'ить в этом случае вторую таблицу...
Я это уже читал в других темах, на других форумал, в литературе. Слова мне не помогут, мне нужен код. На смысл JOIN'а не смотрите, я запрос переделаю, это просто пример
0
kodv
1425 / 1098 / 344
Регистрация: 11.04.2011
Сообщений: 2,606
Завершенные тесты: 1
24.02.2016, 10:14 4
extrimally, Какой вам нужен код? Нельзя одновременно обновить более одной таблицы. Это факт.
0
extrimally
6 / 6 / 2
Регистрация: 22.09.2012
Сообщений: 212
24.02.2016, 10:15  [ТС] 5
Я уже несколько дней голову ломаю. Помогите с кодом в моем случае конкретно плиз. Как создать InsertCommand, UpdateCommand и DeleteCommand вручную ?
Цитата Сообщение от kodv Посмотреть сообщение
Нельзя одновременно обновить более одной таблицы. Это факт.
Как это нельзя? И что делать? Мне нужно! Я читал, что можно, просто не смог код подогнать под свою программу. Мне хотя бы вторую сохранить (две не надо)
0
kodv
1425 / 1098 / 344
Регистрация: 11.04.2011
Сообщений: 2,606
Завершенные тесты: 1
24.02.2016, 10:28 6
extrimally, Я не совсем понимаю, чего вы хотите добиться? InsertCommand создается так:
C#
1
dadpter.InsertCommand = new MySqlCommand("INSERT INTO [Table] (Field1, Field2, ..., FieldN) VALUES (@Value1, @Value2, ..., @ValueN)", new MySqlConnection(connstring));
0
extrimally
6 / 6 / 2
Регистрация: 22.09.2012
Сообщений: 212
24.02.2016, 10:52  [ТС] 7
Цитата Сообщение от kodv Посмотреть сообщение
Я не совсем понимаю, чего вы хотите добиться
Попробую объяснить. Имеется множество таблиц с одинаковыми полями. Это таблицы за разные месяца и годы. Количество строк в таблицах везде одинаковое. Чтобы не создавать кучу таблиц я решил объединить их в одну со множеством строк. Я добавлю новое поле с названием месяца и года, чтобы можно было сделать MySql запрос и вывести только нужные мне строки. Но надо также вывести поля id и name, значения в строках у этих полей всегда будут одинаковыми, поэтому я создал отдельную таблицу с этими значениями (не буду же я забивать мою "длинную" таблицу этими значениями снова и снова, а вдруг потом нужно будет поменять значения поля name?). С этой целью я объединял эти таблицы в dataGridView, но сохранить мне нужно только ту "длинную", name и id естественно не надо, если что их в самом SQL потом изменю.
0
kodv
1425 / 1098 / 344
Регистрация: 11.04.2011
Сообщений: 2,606
Завершенные тесты: 1
24.02.2016, 12:16 8
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
6 / 6 / 2
Регистрация: 22.09.2012
Сообщений: 212
24.02.2016, 13:20  [ТС] 9
Цитата Сообщение от kodv Посмотреть сообщение
В своей практике я предпочитаю в подобных случаях возвращать на клиент ид с справочника, который пользователю отображается в DataGridView через DataGridViewComboBoxColumn
Спасибо за идею, но это выпадающий список получится, а как сделать, чтобы таблица с id, name просто отображалсь слева в первых друх столбцах ? Ее брать из базы, а справа столбцы из моей длинной таблицы
0
kodv
1425 / 1098 / 344
Регистрация: 11.04.2011
Сообщений: 2,606
Завершенные тесты: 1
25.02.2016, 04:31 10
Цитата Сообщение от extrimally Посмотреть сообщение
а как сделать, чтобы таблица с id, name просто отображалсь слева в первых друх столбцах ?
Я же все написал
Цитата Сообщение от kodv Посмотреть сообщение
поставить свойство ReadOnly = true, а DisplayStyle = Nothing, тогда визуально DataGridViewComboBox не будет отличаться от DataGridViewTextBox'а.
А если нужно редактировать эту строку, то, в общем случае, более правильно давать пользователю выбирать значение из списка.
1
extrimally
6 / 6 / 2
Регистрация: 22.09.2012
Сообщений: 212
25.02.2016, 12:34  [ТС] 11
Получилось добавить DataGridViewComboBoxColumn, выглядит как DataGridView, но что-то не могу задать значения. В гугле рылся, ничего не нашел (или не смог просто). Как добавить значения в мои две колонки ComboBoxColumn? Можно прям из программы, из БД не обязательно вытаскивать.
0
kodv
1425 / 1098 / 344
Регистрация: 11.04.2011
Сообщений: 2,606
Завершенные тесты: 1
25.02.2016, 12:57 12
extrimally, Свой код покажите, или скриншот, с помощью которого вы создаете столбцы.
0
extrimally
6 / 6 / 2
Регистрация: 22.09.2012
Сообщений: 212
25.02.2016, 13:14  [ТС] 13
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
1425 / 1098 / 344
Регистрация: 11.04.2011
Сообщений: 2,606
Завершенные тесты: 1
26.02.2016, 11:01 14
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
26.02.2016, 11:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2016, 11:01

Вывести содержимое таблицы MySQL в dataGridView
Здравствуйте. Подскажите, пожалуйста, как можно вывести содержимое таблицы MySQL в dataGridView?...

Как правильно передать данные из таблицы DataGridView в SQL базу данных
Здравствуйте. Есть таблица DataGridView которая содержит данный которые добавляет пользователь или...

Как отобразить данные с таблицы MySQL в DataGridView?
Я новичок в этом деле, учусь. Такой вопрос: Есть БД, есть форма, кнопка и DataGridView. Как...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru