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

Удаление записи из БД и DataGridView

05.10.2014, 13:12. Показов 8233. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте уважаемые программисты, просьба такая: не получается удалить запись из базы данных, имеется DataGridView, отображающий данные из таблицы в БД, но при выполнении метода удаления ничего не происходит и нужная запись не удаляется...

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//метод удаления 
private void DelFieldFormCustomers(int _id)
        {
            if (MessageBox.Show("Удалить запись?", "Удаление записи", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
            {
 
                this.DataGridCustomers.Rows.RemoveAt(this.DataGridCustomers.CurrentRow.Index);
 
                string sSqlCommand = string.Format(@"DELETE FROM [ProductsAndOrders].[dbo].[Customers] 
                                                        WHERE [cust_id] = {0}",_id+1); [U]---в этой строке я поставил _id+1 потому что в базе нумерация записей с 1 начинается, а в C# с "0"[/U]
 
                using (SqlCommand cmd = new SqlCommand(sSqlCommand, this.sConn))
                {
                    sConn.Open();
                    cmd.ExecuteNonQuery();
                    sConn.Close();
                }
            }
        }
в результате удаление происходит только в гриде, в базе таблица не меняется.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.10.2014, 13:12
Ответы с готовыми решениями:

Удаление записи в DataGridView из БД
При нажатии на кнопку "Удалить" выбранная строка не удаляется public partial class DeleteF : Form { public DeleteF() ...

Программное удаление записи из БД Acess через Datagridview
Доброго времени суток. Реализовал добавление данных в БД, но не могу понять как эти данные из БД удалить. Должно работать так : ...

Подставить данные из combobox в DatagridView при создании новой записи в этом DatagridView
Здравствуйте! Возможно я плохо искал, но я искал ответ или наводку на решение. Подскажите пожалуйста: Есть таблица User, записи которой...

12
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
06.10.2014, 06:31
Ilyko, где гарантия того, что в метод будет передан id текущей записи из DataGridView? У вас, по идее, id должен хранится в строке данных, может его от туда читать?
Оберните cmd.ExecuteNonQuery() в try-catch, и посмотрите, валятся ли исключения при выполнении команды. если try-catch ен стоит, то исключения из команд просто глотаются и выполнение текущего метода малча прерывается.
Если исчлючений нет, то посмотрите в дебагере, какой текст по итогу присваивается строке sSqlCommand, и выполните его напрямую на базе данных.
1
2 / 2 / 1
Регистрация: 17.11.2013
Сообщений: 72
06.10.2014, 11:33  [ТС]
Цитата Сообщение от kodv Посмотреть сообщение
Если исчлючений нет, то посмотрите в дебагере, какой текст по итогу присваивается строке sSqlCommand, и выполните его напрямую на базе данных.
Исключение возникает только при попытке удаления связанных записей, но это нормально, т.к каскадного удаления нет. При попытке удалить другие записи, не происходит ничего ( //сам id строки я вывожу нормально на экран и он очевидно имеет присвоенное значение... строка sql-запроса проверена в SQL Server'e

буду Вам очень благодарен, если проверете. Проект прикладываю. форма "FormCustomers"
Вложения
Тип файла: rar AppForShop.rar (78.2 Кб, 29 просмотров)
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
06.10.2014, 12:30
Ilyko, Нет возможности проверить [не]работоспособность вашего кода, так как у меня нет вашего SQL Server'а. Какое значение возвращает cmd.ExecuteNonQuery()? 0?
Что касается _id хочу отметить 2 момента:
1. Если вы напрямую используете свойство DataGridCustomers.CurrentRow.Index в своем методе DelFieldFormCustomers для удлаения записи из грида, и косвенно, передавая его в виде параметра _id, для удаления записи из таблицы БД, то почему бы вам не использовать DataGridCustomers.CurrentRow.Index и там и там и удалить параметр _id нафиг?
2. Свойство Index у строки в DataGridView не имеет никакой связи с Id в базе данных. Надеяться на то, что запись с id'ом 500 будет всегда располагаться на 500 позиции в гриде не стоит. Если вы удалите запись с id'ом 300, то запись с id'ом 500 окажется на позиции 499. И вы будете удалять из грида запись с id'ом 500, а из грида с id'ом 499.
1
2 / 2 / 1
Регистрация: 17.11.2013
Сообщений: 72
06.10.2014, 13:02  [ТС]
Цитата Сообщение от kodv Посмотреть сообщение
Какое значение возвращает cmd.ExecuteNonQuery()? 0?
Да, именно 0 возвращает в любом случае. Что это значит? Как понимаю "Обработано строк 0"?

Добавлено через 3 минуты
Цитата Сообщение от kodv Посмотреть сообщение
и удалить параметр _id нафиг?
Вот, что получается, я передаю параметр id таким образом

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
private void butDelField_Click(object sender, EventArgs e)
        {
            idROw = this.DataGridCustomers.CurrentRow.Index;
            DelFieldFormCustomers(idROw);
            MessageBox.Show(Convert.ToString(idROw));
        }
 
        private void DelFieldFormCustomers(int _id)
        {
            if (MessageBox.Show("Удалить запись?", "Удаление записи", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
            {
                string strSQL = string.Format(@"DELETE FROM [ProductsAndOrders].[dbo].[Customers] 
                                                        WHERE [cust_id] = @ID", _id);
 
                using (SqlCommand cmd = new SqlCommand(strSQL, this.sConn))
                {
                    SqlParameter param = new SqlParameter();
                    param.ParameterName = "@ID";
                    param.Value = _id;
                    param.SqlDbType = SqlDbType.Int;
                    cmd.Parameters.Add(param);
                    sConn.Open();
                    try
                    {
                        int i = 9;
                        i = cmd.ExecuteNonQuery();
                        MessageBox.Show(Convert.ToString(i));
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                    sConn.Close();
                }
                this.DataGridCustomers.Rows.RemoveAt(this.DataGridCustomers.CurrentRow.Index);
            }
По-моему верная передача параметра id
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
06.10.2014, 13:04
Цитата Сообщение от Ilyko Посмотреть сообщение
Что это значит? Как понимаю "Обработано строк 0"?
Совершенно верно. Под условия запроса. который посылаетс в базу данных, не подходит ни одна строка, и, соответственно, ни одна строока не удаляется. В SQLServer Express Edition есть Profiler? Если есть, то посмотрите через него, какаой запрос посылается в базу данных.

Добавлено через 1 минуту
Цитата Сообщение от Ilyko Посмотреть сообщение
Вот, что получается, я передаю параметр id таким образом
Я видел ваш код, поэтому данную фразу и написал.
C#
1
this.DataGridCustomers.Rows.RemoveAt(this.DataGridCustomers.CurrentRow.Index);
Вот здесь вы удаляете строку из DataGridView.
C#
1
idROw = this.DataGridCustomers.CurrentRow.Index;
Вот здесь вы задает значение параметра для метода. Если не видно разницы, зачем вводить дополнитльный параметр?
1
2 / 2 / 1
Регистрация: 17.11.2013
Сообщений: 72
06.10.2014, 13:09  [ТС]
Не совсем понял, какой profiler

Добавлено через 3 минуты
Цитата Сообщение от kodv Посмотреть сообщение
Если не видно разницы, зачем вводить дополнитльный параметр
я удалил переменную idRow, но она меня совсем не беспокоила, мне код казался так более читабельным : )
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
06.10.2014, 13:21
Цитата Сообщение от Ilyko Посмотреть сообщение
Не совсем понял, какой profiler
Вот такой. Если в Пуск-Программы-Microsoft Sql Server [Версия]-Средства обеспечения производительности его нет, значит в Express версии SQL Server он отсутствует. В таком случае перепроверьте запрос, который посылается на сервер. Потому что не может один и тот же запрос из программы не работать, а из Management Studio работать.
Цитата Сообщение от Ilyko Посмотреть сообщение
я удалил переменную idRow, но она меня совсем не беспокоила, мне код казался так более читабельным : )
Теперь следующий этап. Замена this.DataGridCustomers.CurrentRow.Index на (int)DataGridCustomers.CurrentRow["cust_id"] ну и сразу еще следующий - (int)((DataRowView)bs.Current)["cust_id"] =) На нем можно будет оставноиться. С гридом в коде нужно вести минимальную работу - он служит только для отображения данных.
0
2 / 2 / 1
Регистрация: 17.11.2013
Сообщений: 72
06.10.2014, 13:32  [ТС]
Цитата Сообщение от kodv Посмотреть сообщение
Замена this.DataGridCustomers.CurrentRow.Index на (int)DataGridCustomers.CurrentRow["cust_id"]
попытался заменить в строке вызова метода из события

Что-то не так или я не догоняю, ошибка "Error 1 Cannot apply indexing with [] to an expression of type 'System.Windows.Forms.DataGridViewRow' "


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

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private void GridFill()
        {
            ds = new DataSet();
            adapter.Fill(ds, "_Customers");
            bs = new BindingSource(ds, "_Customers");
            DataGridViewRow row = this.DataGridCustomers.RowTemplate;
            row.MinimumHeight = 25;
            this.DataGridCustomers.DataSource = bs;
            this.DataGridCustomers.Columns[0].HeaderText = "Код";
            this.DataGridCustomers.Columns[1].HeaderText = "Клиент";
            this.DataGridCustomers.Columns[2].HeaderText = "Город";
            this.DataGridCustomers.Columns[3].HeaderText = "Контактное лицо";
            this.DataGridCustomers.Columns[4].HeaderText = "Почта";
            this.DataGridCustomers.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            this.DataGridCustomers.ReadOnly = true;
 
 
        }
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
06.10.2014, 13:50
Ilyko, надо было сразу к варианту с bs переходить) По-моему там еще свойство Cells должно быть: (int)DataGridCustomers.CurrentRow.Cells["cust_id"]. Сейчас с телефона - проверит не могу)
0
2 / 2 / 1
Регистрация: 17.11.2013
Сообщений: 72
06.10.2014, 13:53  [ТС]
Цитата Сообщение от kodv Посмотреть сообщение
надо было сразу к варианту с bs переходить) По-моему там еще свойство Cells должно быть: (int)DataGridCustomers.CurrentRow.Cells["cust_id"]. Сейчас с телефона - проверит не могу)
ох, ес, с каждой минутой я чувствую себя глупее и глупее : ) а в консоли удаление так просто происходило, а с DGV тот же принцип не пашет (
Хотя я согласен переписать все заново, так что там насчет BindingSource ? и кода написал пока всего-ничего. Но сижу уже 2 дня парюсь
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
06.10.2014, 14:39
Цитата Сообщение от Ilyko
Хотя я согласен переписать все заново,
Если вы согласны переписать все заново, то посмотрите в сторону DataAdapter'а. Не вижу смысла здесь сейчас выкладывать всю теорию про использование DataAdapter'а. Вы можете ее легко найти в интернете. Прочитайте. Что не поймете, спрашивайте.
1
2 / 2 / 1
Регистрация: 17.11.2013
Сообщений: 72
06.10.2014, 15:22  [ТС]
Цитата Сообщение от kodv Посмотреть сообщение
Прочитайте. Что не поймете, спрашивайте
Спасибо, примите заявку в друзья. И еще одно большое СПАСИБО за все эти ответы : )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.10.2014, 15:22
Помогаю со студенческими работами здесь

Узнать номер записи в DataTable по выбраной записи в DataGridView
Начнем по порядку: есть главная форма, на ней грид заполненный из датасета через биндинг Есть вторая форма из которой производится...

Удаление записи списка из DataGridView
Всем доброго времени суток! Пожалуйста помогите! Получилось создать список в datagridview, а вот сделать так, чтобы удалялась ,мною...

Удаление записи из БД, используя DataGridView
Здравствуйте! Необходимо выполнить удаление записи из таблицы БД при нажатии на кнопку. До этого мы выбираем строку в DataGridView....

Удаление записи из DataGridView и из файла
Помогите с кодом при удалении строки из DataGridView если она 1 пишет что Удаление новой непереданой строки невозможно как это исправить?) ...

Удаление выделенной записи из DataGridView и Базы Данных
Здравствуйте! Добавлено через 31 минуту Почему так не работает? string InstConnectString = @"Data Source=.\SQLEXPRESS; ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru