Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/47: Рейтинг темы: голосов - 47, средняя оценка - 4.94
1 / 1 / 3
Регистрация: 22.06.2013
Сообщений: 168

Обновление данных СУБД PostgreSQL из datagridview через Npgsql

12.09.2016, 10:10. Показов 10480. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! У меня есть БД в СУБД PostgreSQL и я хочу работать с ней из-под C# приложения. Есть код, который загружает базу в datagridview:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
            try{
            SD.DataTable dt = new SD.DataTable();
        NpgsqlCommand npgSqlCommand = new NpgsqlCommand("SELECT * FROM"+" "+Used_Table+"", npgSqlConnection);
        NpgsqlDataReader npgSqlDataReader = npgSqlCommand.ExecuteReader();
        dt.Load(npgSqlDataReader);
            dataGridView1.DataSource =dt;
            dataGridView1.Sort(dataGridView1.Columns[0], System.ComponentModel.ListSortDirection.Ascending);
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
                toolStripStatusLabel2.Text="Ошибка соединения с базой данных";
            }
Пользователь может создавать новые столбцы и строки и выбирать тип данных столбцов.
Я пытаюсь осуществить следующее: чтобы при изменении данных в ячейках таблицы в datagridview данные БД обновлялись.
Вопрос: как это осуществить через Npgsql?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.09.2016, 10:10
Ответы с готовыми решениями:

Обновление данных СУБД PostgreSQL из datagridview
Здравствуйте. Помогите пожалуйста с кнопкой "Обновить". Данные считываются: // Создадим новый набор данных DataSet...

Параметризированный запрос к PostgreSQL через npgsql
Добрый день! Вопрос такой. Почему не срабатывает параметризированный запрос вида: NpgsqlCommand npgSqlCommand = new...

Обновление данных через DataGridView в БД Access
Не могу понять, как обновить данные в БД Access, через DataGridView. Помогите пожалуйста. У меня на форме есть 2 кнопки...

5
27 / 19 / 14
Регистрация: 17.09.2011
Сообщений: 113
12.09.2016, 18:18
Лучший ответ Сообщение было отмечено Tolyanych как решение

Решение

Вам нужно написать параметризованный SQL запрос типа UPDATE. Приведу пример:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
NpgsqlCommand npgSqlCommand = new NpgsqlCommand("UPDATE "+ Used_Table + 
"SET Name = @Name, Salary = @Salary WHERE TableID = @TableID", npgSqlConnection);
NpgsqlParameter Sparam = new NpgsqlParameter();
Sparam.ParameterName = "@TableID";
Sparam.Value = tableID;
Sparam.SqlDbType = SqlDbType.Int;//тип указанный в объявлении столбца таблицы
npgSqlCommand.Parameters.Add(Sparam);
Sparam = new NpgsqlParameter();
Sparam.ParameterName = "@Name";
Sparam.Value = name;
Sparam.SqlDbType = SqlDbType.NVarChar;//тип указанный в объявлении столбца таблицы
npgSqlCommand.Parameters.Add(Sparam);
Sparam = new NpgsqlParameter();
Sparam.ParameterName = "@Salary";
Sparam.Value = salary;
Sparam.SqlDbType = SqlDbType.Decimal;//тип указанный в объявлении столбца таблицы
npgSqlCommand.Parameters.Add(Sparam);
npgSqlCommand.ExecuteNonQuery();
Добавлено через 7 минут
Не рекомендую изменять значение в столбце первичного ключа. Это небезопасно.

Добавлено через 14 минут
Какие значения присвоить переменным tableID, name и salary я думаю вы и сами знаете.
1
1 / 1 / 3
Регистрация: 22.06.2013
Сообщений: 168
12.09.2016, 18:55  [ТС]
Такой вариант я рассматривал, но я боюсь это будет не удобно. Так как пользователь может добавить столбцы, при запросе нужно будет как-то учитывать каждый столбец, структуру которого задается пользователем. Это единственный вариант?
0
27 / 19 / 14
Регистрация: 17.09.2011
Сообщений: 113
12.09.2016, 19:42
Тогда BindingSource вам в помощь.
https://msdn.microsoft.com/ru-... .110).aspx
Но это менее гибкий вариант, чем тот, что я выше предложил.

Добавлено через 9 минут
Возможно, я не так вас понял. В таблице базы данных, к которой вы подключаетесь есть те столбцы, которые может (или будет) добавлять пользователь в datagridview? Если их там нет, то не имеет смысла пользователю добавлять эти столбцы в datagridview. Они не будут обработаны в запросе. А если они там есть, то не вижу проблем в использовании моего первого поста. Просто столбцам, которые будет добавлять пользователь в базе данных нужно разрешить иметь значение null.
1
1 / 1 / 3
Регистрация: 22.06.2013
Сообщений: 168
12.09.2016, 20:25  [ТС]
Да, наверное, Вы правы, буду использовать Ваш первый пост. Тогда нужно будет формировать NpgsqlParameter непосредственно из datagridview, то есть в NpgsqlParameter писать параметры столбцов?и так для каждой ячейки, я правильно понял? А такой вариант не сработает?(вместо value ячейку БД в которую я положу обновленные данные):
C#
1
2
3
 id_na_obnovlenie=dataGridView1.CurrentRow.Cells[0].Value.ToString();
NpgsqlCommand npgSqlCommand = new NpgsqlCommand("update"+" "+Used_Table+" set value='"+ dataGridView1.CurrentCell.Value.ToString() + "' WHERE id='"+id_na_obnovlenie+"'", npgSqlConnection);
npgSqlCommand.ExecuteNonQuery();
0
27 / 19 / 14
Регистрация: 17.09.2011
Сообщений: 113
12.09.2016, 21:41
Лучший ответ Сообщение было отмечено Tolyanych как решение

Решение

Нет такой вариант не будет работать. Тем более, что я думаю едва ли вы будете изменять только одну ячейку за один запрос.
Для каждого параметра нужно создавать отдельный объект NpgsqlParameter. Рекомендую также использовать цикл. Я работаю c Sql Server, там всё то же самое, только названия другие у классов:
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
for (int i = 0; i < dataGridView1.RowCount - 1; i++)
                    {
                        SqlComm = new SqlCommand("UPDATE [Orders]" +
                            " SET UserID = @UserID, SerialNumber = @SerialNumber, Price = @Price, " +
                            "DayDevelop = @DayDevelop, Comm = @Comm WHERE OrderID = @OrderID", SqlConn);
                        Sparam = new SqlParameter();
                        Sparam.ParameterName = "@OrderID";
                        Sparam.Value = dataGridView1.Rows[i].Cells[0].Value;
                        Sparam.SqlDbType = SqlDbType.Int;
                        SqlComm.Parameters.Add(Sparam);
                        Sparam = new SqlParameter();
                        Sparam.ParameterName = "@UserID";
                        Sparam.Value = dataGridView1.Rows[i].Cells[1].Value;
                        Sparam.SqlDbType = SqlDbType.Int;
                        SqlComm.Parameters.Add(Sparam);
                        Sparam = new SqlParameter();
                        Sparam.ParameterName = "@SerialNumber";
                        Sparam.Value = dataGridView1.Rows[i].Cells[2].Value;
                        Sparam.SqlDbType = SqlDbType.NVarChar;
                        SqlComm.Parameters.Add(Sparam);
                        Sparam = new SqlParameter();
                        Sparam.ParameterName = "@Price";
                        Sparam.Value = dataGridView1.Rows[i].Cells[3].Value;
                        Sparam.SqlDbType = SqlDbType.Decimal;
                        SqlComm.Parameters.Add(Sparam);
                        Sparam = new SqlParameter();
                        Sparam.ParameterName = "@DayDevelop";
                        Sparam.Value = dataGridView1.Rows[i].Cells[4].Value;
                        Sparam.SqlDbType = SqlDbType.Int;
                        SqlComm.Parameters.Add(Sparam);
                        Sparam = new SqlParameter();
                        Sparam.ParameterName = "@Comm";
                        Sparam.Value = dataGridView1.Rows[i].Cells[5].Value;
                        Sparam.SqlDbType = SqlDbType.NVarChar;
                        SqlComm.Parameters.Add(Sparam);
                        SqlComm.ExecuteNonQuery();
                    }
Данный код позволяет за один запрос изменять любое кол-во значений в таблице (кроме столбца со значением первичного ключа).
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.09.2016, 21:41
Помогаю со студенческими работами здесь

Обновление источника данных через Datagridview с Dataset
Добрые день. Есть вот такой запрос SQL по которому строится таблица в DataSet. Она выводится на экран с помощью dataGridView1. Скажите как...

Обновление данных в БД через Textbox, DataGridView и DataSet
Всем привет. Столкнулся я недавно с &quot;интересной&quot; проблемой: 1. Создаю подключение к БД программно (ручками в коде). 2. Отображаю...

СУБД PostgreSQL и npgSqlConnection
Добрый день! Вопрос от новичка. Вчера начал работать с PostgreSQL и работать с ней из-под C# приложения. Вопрос такой: npgSqlConnection...

Резервное копирование субд 1с postgresql
Доброго дня!!! Как делать? Система windows 10. Сервер 1с и СУБД на одном компьютере.

Обновление БД из Datagridview через кнопку
Уважаемые друзья. Прошу Вашей помощи в решении вопроса Суть такова Нужно отредактировать запись в Datagridview и...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
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 - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru