Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/49: Рейтинг темы: голосов - 49, средняя оценка - 4.88
61 / 61 / 11
Регистрация: 30.06.2010
Сообщений: 260
1

Нужно добавить новую строку

04.04.2011, 09:33. Показов 8831. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть DataSet, в котором DataTable c первичным ключом. Он связан с DataGridView через BindingSource.
Итак, мне нужно в этот DataTable добавить копию одной из имеющихся в ней строк.
Я создаю переменную:
C#
1
2
// выбирает из DataTable строку, копию которой хочу создать
DataRow row = DataSet.Tables["my_DataTable"].Select("ID = 5").ElementAt<DataRow>(0);
Так как у DataTable имеется первичный ключ, она будет ругаться на то, что вставляю строку с точно таким же ID. Поэтому нужно его изменить:
C#
1
2
3
4
5
6
// Выбираю максимальный ID в этом наборе данных
Object df = DataSet.Tables["my_DataTable"].Select("ID = MAX(ID)").ElementAt<DataRow>(0)["ID"]; 
 // Новой строке (копии) задаю ID больший максимального на 1
row["ID"] = Convert.ToInt32(df)+1;
// Наконец, вставляю готовую строку в DataTable
DataSet.Tables["my_DataTable"].ImportRow(row);
И тут он начинает выдавать ошибку:
"На столбец "ID" наложено ограничение по уникальности. Значение "6" уже имеется."
Почему? На самом деле там нет значения 6!

Я уж пыталась вместо +1 делать +100 - то же самое. +1000 - то же самое!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.04.2011, 09:33
Ответы с готовыми решениями:

Нужно программным способом добавить в таблицу базы новую строку
Нужно программным способом добавить в таблицу базы новую строку, в которую необходимо записать...

Добавить новую строку в таблицу
Доброго времени суток!!! С Visual Studio никогда не работала, а вот теперь приходиться, не могу...

Нужно ввести текст, если он больше 80 символов нужно чтоб он переходил на новую строку
Написал клиент сервер, с командами add-запись в файл, remove-удаление из файла ,display-вывод на...

Добавить новую строку в DataGridView
Добрый день! У меня такая проблема: имеется обект DataGridView, с приявязанной к нему базой...

12
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
04.04.2011, 10:00 2
Wild Wolf, если столбец ID автоинкрементный, то значения в него добавлять не нужно,оно само добавится. Также в столбцах такого типа нельзя заполнить значение, даже при его отсутсвии, т.е. если на данный момент в таблице значения 1,3,11,27 то значения 2,5,6 и т.д. уже использовались и их повторное использование невозможно несмотря на то, что в данный момент они не существуют. Следующе возможное значение - 28
1
61 / 61 / 11
Регистрация: 30.06.2010
Сообщений: 260
04.04.2011, 10:47  [ТС] 3
Да, столбец автоинкрементный. Но хоть я и не изменяю значение значение ID, хоть изменяю его - то же самое: нарушена уникальность. Null попробовать туда подставить?

Добавлено через 2 минуты
DBNull.Value не подходит: "В столбце "ID" не допускаются пустые значения."

Автоинкрементность сейчас уберу.
0
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
04.04.2011, 10:52 4
Wild Wolf, если столбец автоинкрементный, то значение можно добавлять любое, а в столбец автоматически подставится нужное значение. Перегрузи комп, может глюк исчезнет. И покажи запрос на вставку значений
1
61 / 61 / 11
Регистрация: 30.06.2010
Сообщений: 260
04.04.2011, 11:17  [ТС] 5
А, нет. Мне нельзя автоинкремент убирать - а то придется при добавлении новых строк вычислять, какой же ID вставить следующий.

Добавлено через 18 минут
Глюк не исчез.
А запрос на вставку строки -
C#
1
Program.form_Main.form_View.ds_pdb.Tables["v_plan_espc"].ImportRow(row_new);
Добавлено через 6 минут
Я что думаю, может, я вставляю строку, которая уже имеется в наборе DataTable? Типа не клон строки делаю, а ту же самую пытаюсь вставить. Хотя, тогда он должен, по идее, не на уникальность ругаться, а на то, что эта строка уже принадлежит таблице.
0
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
04.04.2011, 11:26 6
Какой запрос (на T-SQL) реализует этот метод?

Добавлено через 7 минут
Цитата Сообщение от Wild Wolf Посмотреть сообщение
Хотя, тогда он должен, по идее, не на уникальность ругаться, а на то, что эта строка уже принадлежит таблице.
Так ругаться он будет, только если у тебя на таблице сделаны индексы уникальности
0
61 / 61 / 11
Регистрация: 30.06.2010
Сообщений: 260
04.04.2011, 11:34  [ТС] 7
Там процедура довольно запутанная.. тем более, в базу я не передаю параметр ID, так как там сделано через последовательность, которая автоматом ставит уникальный ID при вставке новой строки.
Проблема в том, что строка не в базу не вставляется, а в локальный DataTable. Я потом из локального DataTable беру измененные строки (GetChanges) и выполняю процедуру на вставку. Он на уникальность ругается, и не вставляет строку локально.

Я только что попробовала вместо
C#
1
2
// выбирает из DataTable строку, копию которой хочу создать
DataRow row = DataSet.Tables["my_DataTable"].Select("ID = 5").ElementAt<DataRow>(0);
Переделала в
C#
1
DataRow row = DataSet.Tables["my_DataTable"].Select("ID = 5").CopyToDataTable<DataRow>().Rows[0];
И все стало ГУД Действительно, я хоть и меняла ID, он менял у имеющейся строки, когда же пыталась вставить, строка с таким ID уже была.
0
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
04.04.2011, 15:43 8
А так не пробовала вставлять?
DataSet.Tables["my_DataTable"].Rows.Add(параметры_через_запятую);
0
61 / 61 / 11
Регистрация: 30.06.2010
Сообщений: 260
05.04.2011, 07:24  [ТС] 9
Нет, потому что слишком длинно писать надо будет. У меня помимо тех полей, что отображаются в гриде, еще и скрытые есть, которые пользователь не видит, но значения их тоже надо копировать в будущую строку.
0
181 / 107 / 13
Регистрация: 22.03.2010
Сообщений: 456
05.04.2011, 11:26 10
Цитата Сообщение от Wild Wolf Посмотреть сообщение
Нет, потому что слишком длинно писать надо будет. У меня помимо тех полей, что отображаются в гриде, еще и скрытые есть, которые пользователь не видит, но значения их тоже надо копировать в будущую строку.
Используйте типизированные объекты Дататейбл.
Например так:

C#
1
2
3
4
5
6
7
8
private void button2_Click(object sender, EventArgs e)
        {
            if (this.database1DataSet.DataTable1.Rows.Count > 0)
            {
                Database1DataSet.DataTable1Row dr = (Database1DataSet.DataTable1Row)this.database1DataSet.DataTable1.Rows[0];
                this.database1DataSet.DataTable1.AddDataTable1Row(dr.Name);
            }
        }
В данном случае не требуется указывать явно индекс записи.
1
61 / 61 / 11
Регистрация: 30.06.2010
Сообщений: 260
05.04.2011, 12:01  [ТС] 11
Цитата Сообщение от Nukutu Посмотреть сообщение
Используйте типизированные объекты Дататейбл.
Но у меня пишет по этому поводу: "Эта строка уже принадлежит данной таблице."
Правда, я немножко не так использую.
Мне нужно выбрать из данной таблицы строку ID которой равен, допустим, 5.
Поэтому у меня получается как то так:
C#
1
2
3
4
5
6
7
8
private void button2_Click(object sender, EventArgs e)
        {
            if (this.database1DataSet.DataTable1.Rows.Count > 0)
            {
                Database1DataSet.DataTable1Row dr = (Database1DataSet.DataTable1Row)this.database1DataSet.DataTable1.Select("ID = 5").ElementAt<DataRow>(0);
                this.database1DataSet.DataTable1.AddDataTable1Row(dr); // У dr там нету свойства Name
            }
        }
Добавлено через 7 минут
Даже когда делаю как вы предлагаете:

C#
1
2
3
4
5
6
7
8
private void button2_Click(object sender, EventArgs e)
        {
            if (this.database1DataSet.DataTable1.Rows.Count > 0)
            {
                Database1DataSet.DataTable1Row dr = (Database1DataSet.DataTable1Row)this.database1DataSet.DataTable1.Rows[0];
                this.database1DataSet.DataTable1.AddDataTable1Row(dr);
            }
        }
все равно ругается на то, что Эта строка уже принадлежит данной таблице
0
181 / 107 / 13
Регистрация: 22.03.2010
Сообщений: 456
05.04.2011, 13:46 12
Цитата Сообщение от Wild Wolf Посмотреть сообщение
Даже когда делаю как вы предлагаете:

C#
1
2
3
4
5
6
7
8
private void button2_Click(object sender, EventArgs e)
        {
            if (this.database1DataSet.DataTable1.Rows.Count > 0)
            {
                Database1DataSet.DataTable1Row dr = (Database1DataSet.DataTable1Row)this.database1DataSet.DataTable1.Rows[0];
                this.database1DataSet.DataTable1.AddDataTable1Row(dr);
            }
        }
все равно ругается на то, что Эта строка уже принадлежит данной таблице
Так будет ругаться, так как в dr сидит индекс.
Если используешь второй вариант параметров данной функции, то будет работать.
Правда тебе облом перечислять все 100 параметров. Можно подумать об автоматизации этого процесса.

Добавлено через 10 минут
Цитата Сообщение от Wild Wolf Посмотреть сообщение
У dr там нету свойства Name
Это не свойство, а название столбца в ДатаТейбл (для примера), т.е. таблица состоит из столбцов id, Name.
0
61 / 61 / 11
Регистрация: 30.06.2010
Сообщений: 260
05.04.2011, 14:23  [ТС] 13
Цитата Сообщение от Nukutu Посмотреть сообщение
Это не свойство, а название столбца в ДатаТейбл
Да, названия столбцов там были.
Но я уже решила проблему тем, что создаю копию DataTable, в которую помещаю эту строку, изменяю там ID и из нее уже вставляю в нужный DataTable.
C#
1
DataRow row = DataSet.Tables["my_DataTable"].Select("ID = 5").CopyToDataTable<DataRow>().Rows[0];
Вот. Коряво, конечно.
1
05.04.2011, 14:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.04.2011, 14:23
Помогаю со студенческими работами здесь

Добавить новую строку после симовлов
Есть такой текст (&quot;frpcda1e&quot; может быть любым): Тест цитаты Тест цитаты Тест цитаты Тест цитаты...

Как в ComboBox добавить новую строку?
Кто нибудь знает как в ComboBox добавить новую стоку так, что бы при выходе из программы введеные...

Как добавить перевод на новую строку?
Form2.txt1.Text = z.x &amp; vbtab &amp; z.y &amp; vbtab &amp; 0 Так чтобы не заменяясь писалось на новой строке.

Как добавить новую строку в CString?
Здравствуйте, уважаемые форумчане! Как в CString добавить новую строку?


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru