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

Можно ли обновить данные таблицы через DataGridView?

15.05.2014, 11:30. Просмотров 6377. Ответов 27
Метки нет (Все метки)

Народ, скиньте пожалуйста пример или на пальцах объясните пожалуйста, как обновить данные в таблице при изменении значения поля в DataGridView? Грубо говоря, есть форма, на которой DataGridView. Если тыкнуть на какую-нибудь ячейку, то DataGridView дает внести изменения. Надо сделать кнопку, чтобы эти изменения отразились в базе.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2014, 11:30
Ответы с готовыми решениями:

Обновить данные в dataGridView
Здравствуйте, пишу программу, заполняются текстбоксы, кликается кнопка записать, данные...

Не могу связать WPF с MS Access через DataGridView: Не удается получить данные схемы для таблицы или представления
Помогите пожалуйста при попытке связать форму с БД вылезает сообщение следующего вида: "<> Не...

Обновить данные DataGridView из другой формы
Здрасте всем.Я здесь в первый раз так что сразу прошу прощения если такой вопрос уже был на форуме....

Как обновить данные в dataGridView из БД Sql
Доброго времени суток. Подскажите пожалуйста, не могу разобраться! Есть dataGridView, есть...

Не получается обновить данные в БД SQL Server при изменении данных в dataGridView
ADO.NET C# Добавлено через 2 минуты using System; using System.Collections.Generic; using...

27
Spawn
972 / 870 / 353
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
15.05.2014, 11:38 2
Для начала скажите, как данные туда попадают
0
nio
5970 / 3376 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
15.05.2014, 11:40 3
Предполагаю, что данные в dgv у тебя попадают через адаптер. В таком случае после внесения всех изменений необходимо для адаптера вызвать метод Update.
0
GaS_597
1 / 1 / 4
Регистрация: 06.05.2014
Сообщений: 159
15.05.2014, 11:49  [ТС] 4
Не совсем... Строго не судите. На тот момент я только неделю как начал изучать C# и ООП...
Для вставки новых данных используется отдельная форма Form2. При нажатии на кнопку выполняется insert и при закрытии Form2, Form1 обновляется.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Вставляем новые данные в таблицу 
        private void AddProduct()
        {
            string txtQuery = "insert into NameProduct values (NULL,'" + NameProduct.Text + "','" + Protein.Text + "','" + Fat.Text + "','" + Carb.Text + "','" + Calories.Text + "')";
            Common.ExecuteQuery(txtQuery);
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            Form1 f1 = new Form1();
            AddProduct();
            NameProduct.Text = string.Empty;
            Common.Load_Form();
            Close();
        }
Класс Common
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//Выполнение запросов
        public static void ExecuteQuery(string txtQuery)
        {
            Connection();
            sql_cmd = connect.CreateCommand();
            sql_cmd.CommandText = txtQuery;
            sql_cmd.ExecuteNonQuery();
            Disconnect();
        }
 
//Загрузка формы
       
        public static void Load_Form()
        {
            Connection();
            //Запрос данных из БД
            sql_cmd = new SQLiteCommand("select ID, NameProduct, Protein, Fat, Carb, Calories from NameProduct", Food.Common.connect);
            adapter = new SQLiteDataAdapter(sql_cmd);
            DS.Reset();
            adapter.Fill(DS);
            DT = DS.Tables[0];
            Disconnect();
        }
0
15.05.2014, 11:49
nio
5970 / 3376 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
15.05.2014, 14:43 5
мдя , есть куда расти

в первом коде 10-я строка, во втором 15-я и 22-я не нужны совсем.

Всё остальное я бы тоже переписал, ну да ладно. Непонятным остаётся, где присвоение данных в dgv.
DS создан руками или дизайнером?
0
nmcf
6527 / 5751 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
15.05.2014, 14:46 6
Ничего не понятно. Form1 - это что? Где расположен DataGridView и как он заполняется?
0
GaS_597
1 / 1 / 4
Регистрация: 06.05.2014
Сообщений: 159
16.05.2014, 06:27  [ТС] 7
Как можно построить метод, который бы выполнял "Update Table set.... where" через изменение поля в DataGridView? Я не понимаю как сделать, чтобы можно было выбирать любое поле для изменения.

C#
1
2
3
4
5
6
7
8
9
10
 //Удаление записей
        public static void UpdateProduct()
        {
            Connection();            
            int id = Convert.ToInt32(DT.Rows[dgv.CurrentRow.Index]["ID"]);
 
            string txtQuery = "Update NameProduct set  ПОЛЕ = НОВОЕ ЗНАЧЕНИЕ where id=" + id;
            ExecuteQuery(txtQuery);
            Disconnect();
        }
0
kodv
1430 / 1103 / 344
Регистрация: 11.04.2011
Сообщений: 2,606
Завершенные тесты: 1
16.05.2014, 07:28 8
GaS_597, в методе Load_Form:
C#
1
2
3
4
5
6
7
8
SQLiteCommand updCommand = new SQLiteCommand("UPDATE NameProduct SET NameProduct = :NameProduct, Protein = :Protein, Fat = :Fat, Carb = :Carb, Calories = :Calories WHERE Id = :Id", Food.Common.Connect);
updCommand.Parameters.Add("NameProduct", SQLType.String, 100, "NameProduct");
updCommand.Parameters.Add("Protein", SQLType.Int32, 0, "Protein");
updCommand.Parameters.Add("Fat", SQLType.Int32, 0, "Fat");
updCommand.Parameters.Add("Carb", SQLType.Int32, 0, "Carb");
updCommand.Parameters.Add("Calories", SQLType.Int32, 0, "Calories");
updCommand.Parameters.Add("Id", SQLType.Int32, 0, "Id");
adapter.UpdateCommand = updCommand;
Для сохранения
C#
1
adapter.Update(DS.Tables[0]);
0
nmcf
6527 / 5751 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
16.05.2014, 09:44 9
Всё это сделает один CommandBuilder и не только для Update, а ещё и для Insert и Delete.
0
kodv
1430 / 1103 / 344
Регистрация: 11.04.2011
Сообщений: 2,606
Завершенные тесты: 1
16.05.2014, 10:12 10
nmcf, почему вы так настойчиво при каждой удобной возможности пропогандируете отказ от изучения SQL в пользу использования CommandBuilder'а? Пусть люди учат SQL. Без знаний SQL далеко в программирование приложений для баз данных не уйдешь.
На сколько корректно будет создавать CommandBuilder команды в следующих ситуациях?
1. В SelectCommand данные выбираются не из одной таблицы, а из нескольких.
2. В SelectCommand выбираются не все поля из таблицы, а только часть, но при вставке новой строки нужно указывать все поля.
3. В SelectCommand находится не запрос SQL, а хранимая процедура.
0
nmcf
6527 / 5751 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
16.05.2014, 10:43 11
Я не пропагандирую отказ от изучения SQL, учите на здоровье.
Просто цель-то какая? Создать приложение или с SQL развлекаться? Это мне напоминает те задачки по C++ где студенты программируют вручную списки, вместо того, чтобы использовать STL.

Да есть случаи, когда нужен SQL, но у большинства не они.

1. Не делайте так. Кто заставляет?
2. Если в списке есть ключевое поле и не заданы слишком жёсткие условия контроля на значения полей, то будет работать. Можно выбирать все поля, но не все отображать.
3. Вот этот вариант не проверял. Но даже если так. Можно настроить команды вручную, но один раз в начале программы.
0
GaS_597
1 / 1 / 4
Регистрация: 06.05.2014
Сообщений: 159
16.05.2014, 11:29  [ТС] 12
Всем спасибо! Сделал немного иначе. Все работает. Насколько это правильное решение?
Жмакаем кнопку Update на Form1
C#
1
2
3
4
5
6
7
8
9
10
11
12
private void button2_Click(object sender, EventArgs e)
        {
            i = Convert.ToInt32(Common.DT.Rows[dgv.CurrentRow.Index]["ID"]);
            NameProduct = Convert.ToString(Common.DT.Rows[dgv.CurrentRow.Index]["NameProduct"]);
            Protein = Convert.ToDouble(Common.DT.Rows[dgv.CurrentRow.Index]["Protein"]);
            Fat = Convert.ToDouble(Common.DT.Rows[dgv.CurrentRow.Index]["Fat"]);
            Carb = Convert.ToDouble(Common.DT.Rows[dgv.CurrentRow.Index]["Carb"]);
            Calories = Convert.ToDouble(Common.DT.Rows[dgv.CurrentRow.Index]["Calories"]);
            Common.UpdateProduct(NameProduct, Protein, Fat, Carb, Calories, i);
            Common.Load_Form();
            Form1_Update();
        }
Класс Common, где находятся все методы работы с базой.
C#
1
2
3
4
5
6
7
8
//Обновление полей
        public static void UpdateProduct(string NameProduct, double Protein, double Fat, double Carb, double Calories, int id)
        {
            Connection();
            string txtQuery = "Update NameProduct set NameProduct = '"+NameProduct+"', Protein =" +Protein+", Fat =" +Fat+", Carb = "+Carb+", Calories = "+Calories+" where id=" + id;
            ExecuteQuery(txtQuery);
            Disconnect();
        }
Добавлено через 6 минут
Но есть один нюанс. Можно редактировать только одну строку. Если отредактировал несколько строк, то программа обновляет только последнюю. Интересно можно сохранить одновременно все изменения?
0
nmcf
6527 / 5751 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
16.05.2014, 11:35 13
GaS_597, ну это же ерунда. А если пользователь выйдет из текущей строки перед тем как нажать кнопку сохранить? Сохранится совсем не то, что ты хотел. Если не нравится адаптер данных, то пользуйся хотя бы возможностями DataTable. Там можно получить набор строк, которые были модифицированы элементом управления и уже их сохранять. Хотя это повторение того, что адаптер делает сам.
0
GaS_597
1 / 1 / 4
Регистрация: 06.05.2014
Сообщений: 159
16.05.2014, 11:48  [ТС] 14
Дело не в том, что мне нравится или нет. Я вторую неделю работаю в C# и делаю эту программу. Дело в том, что изначально был выбран более простой путь, т.к. я до сих пор не совсем понимаю как работать через DataTable и SQLiteDataAdapter. Я сначала выполняю запрос, потом у меня запускается обновление Form1, где заново подгружаются данные в DataGridView через SQLiteDataAdapter.
Переменные
C#
1
2
3
4
5
 public static SQLiteConnection connect;
        public static SQLiteCommand sql_cmd;
        public static SQLiteDataAdapter adapter;
        public static System.Data.DataTable DT = new System.Data.DataTable();
        public static System.Data.DataSet DS = new System.Data.DataSet();
C#
1
2
3
4
5
6
7
8
9
//Выполнение запросов
        public static void ExecuteQuery(string txtQuery)
        {
            Connection();
            sql_cmd = connect.CreateCommand();
            sql_cmd.CommandText = txtQuery;
            sql_cmd.ExecuteNonQuery();
            Disconnect();
        }
Обновление формы
C#
1
2
3
4
5
6
7
8
9
10
11
public static void Load_Form()
        {
            Connection();
            //Запрос данных из БД
            sql_cmd = new SQLiteCommand("select ID, NameProduct, Protein, Fat, Carb, Calories from NameProduct", Food.Common.connect);
            adapter = new SQLiteDataAdapter(sql_cmd);
            DS.Reset();
            adapter.Fill(DS);
            DT = DS.Tables[0];
            Disconnect();
        }
Добавлено через 1 минуту
Никто не говорит как правильно делать. У каждого свое мнение. Если не сложно может подскажешь как нужно делать правильно? Лучше учить сразу делать правильно, чем потом переучиваться. Могу скинуть проект. В принципе то, что я хотел сделать я сделал.
0
nmcf
6527 / 5751 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
16.05.2014, 11:54 15
Добавить CommandBuilder:
C#
1
2
3
4
5
6
7
8
9
10
11
12
public static void Load_Form()
        {
            Connection();
            //Запрос данных из БД
            sql_cmd = new SQLiteCommand("select ID, NameProduct, Protein, Fat, Carb, Calories from NameProduct", Food.Common.connect);
            adapter = new SQLiteDataAdapter(sql_cmd);
            SQLiteCommandBuilder sqCommandBuilder = new SQLiteCommandBuilder(adapter); // CommandBuilder
            DS.Reset();
            adapter.Fill(DS);
            DT = DS.Tables[0];
            Disconnect();
        }
Сохрянть одной командой:
C#
1
adapter.Update(DS.Tables[0]);
Добавлено через 2 минуты
В такой схеме не важно, сколько строк редактировал пользователь и в каком порядке. Сохранится всё, включая удаление и вставку новых.
0
kodv
1430 / 1103 / 344
Регистрация: 11.04.2011
Сообщений: 2,606
Завершенные тесты: 1
16.05.2014, 12:16 16
Цитата Сообщение от nmcf Посмотреть сообщение
Можно настроить команды вручную, но один раз в начале программы.
Можно настроить команды вручную в дизайнере, и не задумываться о них в дальнейшем. Есть возможность в дизайнере их автоматически сгенерировать, сразу посмотреть результат и исправить, если они они сгенерировались коряво. Это намного удобнее, чем использование CommandBuilder'а.

Цитата Сообщение от kodv Посмотреть сообщение
1. В SelectCommand данные выбираются не из одной таблицы, а из нескольких.
Цитата Сообщение от nmcf Посмотреть сообщение
1. Не делайте так. Кто заставляет?
Хочу пользователю в гриде показывать данные из связанных таблиц. Если эти таблицы не нужны по отдельности, то проще сделать пару JOIN'ов на стороне сервера, нежели вопроизводить всю схему данных на сторне клиента. Если SELECT, INSERT, UPDATE и INSERT я буду писать вручную, допустим, в дизайнере, то проблем не возникнет. Если же доверится CommandBuilder'у ...
Цитата Сообщение от kodv Посмотреть сообщение
2. В SelectCommand выбираются не все поля из таблицы, а только часть, но при вставке новой строки нужно указывать все поля.
Цитата Сообщение от nmcf Посмотреть сообщение
2. Если в списке есть ключевое поле и не заданы слишком жёсткие условия контроля на значения полей, то будет работать. Можно выбирать все поля, но не все отображать.
Допустим, в таблице 10 полей, мы выбираем для отображения 4 поля, вставляем 7 (3 поля какие-нибудь вычисляемые). Если доверится CommandBuilder'у, то сгенерируется команда только для вставки 4-х полей. Можно, конечно, выбирать и все 7, и не нужные скрывать, но это уже попытка подстроится под CommandBuilder.
Цитата Сообщение от kodv Посмотреть сообщение
3. В SelectCommand находится не запрос SQL, а хранимая процедура.
Цитата Сообщение от nmcf Посмотреть сообщение
3. Вот этот вариант не проверял. Но даже если так
Не даже если, а именно так. CommandBuilder бесполезен в случае хранимой процедуры.

Я это все к чему. В большинстве простых ситуаций в простых программах CommandBuilder отработает вполне корректно. Но в жизни каждого программиста рано или поздно возникнет тупиковая ситуация, когда CommandBuilder будет не в состоянии справится с ситуацией. Еще печальнее, если программист окажется не в состоянии самостоятельно настроить адаптер. Если у потанциального программиста есть желание покопаться в SQL и понастраивать вручную адаптеры, то не нужно ему говорить "нах тебе это нужно, используй CommandBuilder".

Добавлено через 3 минуты
Цитата Сообщение от GaS_597 Посмотреть сообщение
Никто не говорит как правильно делать.
Вам все говорят, что нужно обновлять данные через адаптер. Мнения расходятся только в методах его настройки. nmcf, настаивает на том, чтобы вы использовали CommandBuilder. Я говорю, что если вам охота копаться с SQL, то копайтесь с ним на здоровье. Даже пример вам привел, как в вашем случае создать команду для обновления данных.
0
GaS_597
1 / 1 / 4
Регистрация: 06.05.2014
Сообщений: 159
16.05.2014, 12:50  [ТС] 17
Спасибо! Добавил строку с SQLiteCommandBuilder в метод Load_Form(). Закомментил метод с SQL и все переменные в классе. При нажатии кнопки отрабатывает Common.adapter.Update(Common.DS.Tables[0]); Все работает! Шикарно. Получается метод с SQL удобно применять при работе с несколькими таблицами одновременно? А CommandBuilder можно применять при работе с одной таблицей в DataGridView? Так? А предыдущий способ я так понимаю работал без адаптера?
0
nmcf
6527 / 5751 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
16.05.2014, 15:14 18
Разумеется, CommandBuilder можно применять и с несколькими таблицами, только каждой таблице - свой адаптер и свой CommandBuilder.

Добавлено через 18 минут
kodv, я не утверждаю, что адаптер + CommandBuilder годятся на все случаи жизни, но во многих простых программах - да. Ты же начинаешь описывать какие-то маргинальные случаи.
Я хотел сказать, что сохранение делается адаптером и это правильно. Настраивается он CommandBuilder'ом чаще всего. Желающие могут настраивать вручную. Я против того, чтобы пихать во все обработчики SQL-команды, а потом спрашивать, почему ошибки, почему изменений не видно и прочее.
Что касается частичной выборки полей таблиц и выборки из нескольких. Если нужно просто показать результат, то CommandBuilder и не нужен. Если же нужно вносить изменения, то проблемы могут быть хоть с адаптером, хоть без него. Когда понадобится сохранять запись, откуда будешь брать недостающие поля? Срочно считывать? Т. е. тоже самое.
0
Ayazzali
0 / 0 / 0
Регистрация: 06.11.2015
Сообщений: 7
06.11.2015, 00:34 19
kodv, Прошу ткнуть пальцем где читать как создать UpdateCommand для связанных таблиц
(есть главная таблица, которая сост из полей др таблиц - бд компьютеров и их комплектующих).

Или лучше пусть это сделает C# -может библиотеки какие нибудь есть, я же не один кому не оч охото писать это, к тому же хочу чтоб прога сама адаптировалась к бд-бд будет пополняться новыми полями(сейчас она состоит http://cabiport.com/ayaz/123.PNG)

(это моё первое сообщение ...)
0
kodv
1430 / 1103 / 344
Регистрация: 11.04.2011
Сообщений: 2,606
Завершенные тесты: 1
06.11.2015, 11:14 20
Судя из приведенного вами скриншота мне не понятно, зачем вам нужно обновление связанных таблиц. Тем не менее, если отвечать на вопросы по порядку.
Цитата Сообщение от Ayazzali Посмотреть сообщение
Прошу ткнуть пальцем где читать как создать UpdateCommand для связанных таблиц
Нигде, так как командой UPDATE можно обновить единовременно только одну таблицу БД. Если нужно обновить две таблицы, то нужно писать две команды UPDATE.
Цитата Сообщение от Ayazzali Посмотреть сообщение
Или лучше пусть это сделает C# -может библиотеки какие нибудь есть
C# - это язык программирование, то есть, набор синтаксических правил, с помощью которых можно выразить алгоритм. То есть, C# даже гипотетически этого сделать не сможет. Это примерно как варить кофе в инструкции от кофеварки. Всякие CommandBuilder'ы из библиотеки .NET предпочитают игнорировать запросы, в которых используется более одной таблицы. Библиотеки, конечно, есть. попробуйте освоить Enitity Framework, может с ним вам будет проще.
0
06.11.2015, 11:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.11.2015, 11:14

Обновить DataGridView при внесении данных через форму
Добрый день, Есть форма с DataGridView и кнопкой редактировать. По нажатию кнопки появляется...

Как обновить данные в БД через DataSet
Ребята, всем привет. Помогите пожалуйста прописать свойства UpdateCommand. За два дня перечитала 34...

Как отобразить через Combobox в datagridview значение 1-й связанной таблицы через 2-ю и записать знач 2-й в 3
Здравствуйте. Уперся в необычную для меня проблему:как отобразить через Combobox в datagridview...


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

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

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