Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614

Удаление/Добавление строк в зависящие таблицы

14.01.2017, 19:22. Показов 1898. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем! Такой вопрос:
Как добавлять/удалять строки из зависимых таблиц?
К примеру есть две таблицы - Data и History. History имеет foreign key id_data на поле id в таблице Data. Затем добавляю два DataGridView на форму, два BindingSource, DataSet, короче все по стандарту. При перемещение по строкам в DataGridView, который отображает таблицу Data изменяются соответствующие строки в DataGridView, который отображает History. Все круто.

Да, забыл сказать, мне нужно обновлять всю базу данных только по закрытию программы. Тоесть:
C#
1
2
3
4
5
        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            this.dataTableAdapter.Update(this.localDBDataSet.Data);
            this.historyTableAdapter.Fill(this.localDBDataSet.History);
        }
Итак, как мне сделать удаление/добавление строк в эти две таблицы?
Возьмем добавление строк в Data. Делаю так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        private void button1_Click(object sender, EventArgs e)
        {
            var addRowToDataForm = new AddRowToDataForm();
            if (addRowToDataForm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                // Создаем новую строку
                DataRow newDataRow = localDBDataSet.Data.NewRow();
                newDataRow["id"] = Guid.NewGuid();
                newDataRow["name"] = addRowToDataForm.name;
 
                localDBDataSet.Data.Rows.Add(newDataRow);
            }
        }
Все здорово добавляется, сразу же обновляется DataGridView и показывает новую строку.
Теперь удаление строки из Data. Вот код:
C#
1
2
3
4
5
6
7
8
9
        private void button3_Click(object sender, EventArgs e)
        {
            var removeRowFromDataForm    =   new RemoveRowFromDataForm();
            if (removeRowFromDataForm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                DataRow selectedRow = localDBDataSet.Data.Rows[dataDataGridView.CurrentCell.RowIndex];
                localDBDataSet.Data.Rows.Remove(selectedRow);
            }
        }
А вот он уже не работает Да и кстати мне нужно при удалении строки из Data, удалять соответствующие строки из History по внешнему ключу.

В History покажу только добавление(удаление аналогично не знаю, как и с Data):
C#
1
2
3
4
5
6
7
8
9
10
11
        private void button1_Click(object sender, EventArgs e)
        {
            var addRowToHistoryForm = new AddRowToHistoryForm();
            if (addRowToHistoryForm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                DataRow newHistoryRow = localDBDataSet.History.NewRow();
                newHistoryRow["id"] = Guid.NewGuid();
                newHistoryRow["report"] = addRowToHistoryForm.report;
                [B]newHistoryRow["id_data"] = dataRow["id"];[/B]
            }
        }
Добавление проходит успешно, зависимость между таблицами происходит, НО обязательно ли индефицировать поле id_data полем id из таблицы Data(строчка, которую я выделил в коде выше)? Рази не должно происходить это автоматом, если у меня задана связь между таблицами?

Помогите пожалуйста разобраться! Буду очень признателен

Добавлено через 39 минут
Короче вот так получилось удалять строки из Data и History:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        private void button3_Click(object sender, EventArgs e)
        {
            var removeRowFromDataForm    =   new RemoveRowFromDataForm();
            if (removeRowFromDataForm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                // Выбранная строка
                DataRow selectedRow = localDBDataSet.Data.Rows[dataDataGridView.CurrentCell.RowIndex];
 
                // Ищем все строки истории, относящиеся к выбранной строке и удаляем их
                var historyRows = localDBDataSet.History.Select("id_data = '" + selectedRow["id"] + "'");
                foreach (var dataRow in historyRows)
                    localDBDataSet.History.Rows.Remove(dataRow);
                
                // Удаляем выбранную строку
                localDBDataSet.Data.Rows.Remove(selectedRow);
            }
        }
Из DataSet и DataGridView они удаляются, но при закрытии формы не происходит обновление базы данных почему-то:
C#
1
2
3
4
5
        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            dataTableAdapter.Update(localDBDataSet.Data);
            historyTableAdapter.Update(localDBDataSet.History);
        }
Причем добавление строк в Data и History проходит также успешно, и код, обновления базы данных при закрытии программы, также обновляет базу. Странно, при добавление обновление происходит, а при удалении нет.

Ребята, я жду ваших ответов!
Может я вообще все не так делаю?

Добавлено через 1 час 20 минут
Оказывается надо писать вот так, чтобы и обновление в базе происходило:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        private void button3_Click(object sender, EventArgs e)
        {
            var removeRowFromDataForm    =   new RemoveRowFromDataForm();
            if (removeRowFromDataForm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                // Выбранная строка
                DataRow selectedRow = localDBDataSet.Data.Rows[dataDataGridView.CurrentCell.RowIndex];
 
                // Ищем все строки истории, относящиеся к выбранной строке и удаляем их
                var historyRows = localDBDataSet.History.Select("id_data = '" + selectedRow["id"] + "'");
                foreach (var dataRow in historyRows)
                    dataRow.Delete();
                
                // Удаляем выбранную строку
                selectedRow.Delete();
            }
        }
С чем это связано, я хрен знает. Почему так нельзя localDBDataSet.History.Rows.Remove(dataR ow); я тоже не знаю.
Спасибо всем, что оказали максимальную помощь
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.01.2017, 19:22
Ответы с готовыми решениями:

Добавление и удаление строк БД
Работаю с БД из vs 2010 c# подключал бд не программно Есть две проблемы: 1) При добавлении строки получается два состояния добавления...

Добавление и удаление данных из таблицы
Здравствуйте.Недавно начал изучать ADO.NET, написал программу, как сделать чтобы можно было добавлять и удалять данные из таблицы?если...

Удаление и добавление строк в DataGridView
Здравствуйте! Я только что начал изучать базы данных и сделал небольшую базу. У меня возникла проблема с DataGridView. Когда я добавляю...

8
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
14.01.2017, 23:59
Цитата Сообщение от Bretbas Посмотреть сообщение
С чем это связано, я хрен знает.
Связано с тем, что адаптер анализирует состояние строк. То есть, чтобы удалить строку из базы, должна быть соответствующая строка в DataTable с пометкой "удалена". В случае же удалении строки из коллекции Rows адаптер при обновлении не сможет определить - строка была удалена или она вообще не запрашивалась из базы.
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
16.01.2017, 18:29  [ТС]
TopLayer, Хорошо, но если я применю remove для DataSet и удалю какую-нибудь строку из коллекции в DataSet, то зачем мне ее помещать в состоянии "Удаленная", если я ее и так и так убрал из DataSet. Неужели неочевидно, что она мне больше не нужна, раз я ее убрал из коллекции DataSet? Зачем тогда вообще метод remove нужен?
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
17.01.2017, 17:12
Bretbas, а можно узнать тип переменной localDBDataSet? Просто, если localDBDataSet.Data.Rows имеет тип DataRowCollection, то метод Remove должен вызывать метод Delete. Вот реализация этого метода:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        /// <devdoc>
        /// <para>Removes the specified <see cref='System.Data.DataRow'/> from the collection.</para>
        /// </devdoc>
        public void Remove(DataRow row) {
            if ((null == row) || (row.Table != table) || (-1 == row.rowID)) {
                throw ExceptionBuilder.RowOutOfRange();
            }
 
            if ((row.RowState != DataRowState.Deleted) && (row.RowState != DataRowState.Detached))
                row.Delete();
 
            if (row.RowState != DataRowState.Detached)
                row.AcceptChanges();
        }
1
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
17.01.2017, 17:40  [ТС]
TopLayer, localDBDataSet построена автоматически, после переноса DataSource из окна DataSources на форму. Реализацию Remove не могу посмотреть, не дает. Только вижу объявление
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
17.01.2017, 19:36
Цитата Сообщение от Bretbas Посмотреть сообщение
Зачем тогда вообще метод remove нужен?
Вы же не обязаны всю логику вашего приложения формировать посредством языка SQL. Вы можете запросить, например, все строки из базы данных и уже потом решить, какие из них отдать для редактирования пользователю. Но при этом, те строки, которые не пошли под редактирование, вы хотите оставить в базе данных. Если вы вызовете Delete для этих строк, то впоследствии они удалятся из базы, а вот если воспользуетесь методом Remove, то они в базе останутся.
1
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
17.01.2017, 19:43  [ТС]
TopLayer,
Цитата Сообщение от TopLayer Посмотреть сообщение
Вы можете запросить, например, все строки из базы данных и уже потом решить, какие из них отдать для редактирования пользователю. Но при этом, те строки, которые не пошли под редактирование, вы хотите оставить в базе данных.
Как вариант. Но для этого есть фильтры. В BindingSource например
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
17.01.2017, 19:50
Цитата Сообщение от Bretbas Посмотреть сообщение
Но для этого есть фильтры. В BindingSource например
Фильтр не освободит память. Также алгоритм выбора записей может быть очень мудрёным, и строковой фильтр будет неудобно использовать.
1
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
17.01.2017, 19:57  [ТС]
TopLayer, Короче понял Спасибо за ответы. C# дает много много разнообразных подходов, а найти подходящий новичку достаточно сложно А задачу нужно решить в любом случае
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.01.2017, 19:57
Помогаю со студенческими работами здесь

Добавление/удаление строк из БД MS SQL Compact
Доброе утро всем программистам. Я не то чтобы новичек но и не гуру шарпа, задача у меня стоит следующая: есть у меня Datagridview, форма...

Добавление, изменение и удаление строк dataGridView
Добрый вечер, форумчане. Помогите пожалуйста, кто сможет. Ситуация такая: есть форма с объектом dataGridView, которая отображает содержимое...

Добавление и удаление строк в модели таблицы AbstractTableModel
Подскажите пожалуйста, как можно реализовать в своей модели таблицы добавление и удаление строк по принципу addRow и removeRow модели...

Добавление/Удаление строк таблицы в Эксель программно
Возможно ли в Эксель через Vba Сделать следующее: Есть таблицы на листе . От кнопок размещенных на листе, хочу добавить или удалить...

Список: добавление и удаление строк
Есть список напримерУдалите первые 2 элемента и добавьте 2 новых. Выведите список на экран my_string = , ] ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru