Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/75: Рейтинг темы: голосов - 75, средняя оценка - 4.77
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,079
1

Получение значения ключевого поля после выполнения команды TableAdapter.Insert()

01.04.2012, 13:04. Показов 15377. Ответов 32
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Использую типизированный датасет в котором заданы DataTable и TableAdapter к ним. Не могу понять как получить значение ключевого поля генерируемого базой после выполнения метода TableAdapter.Insert().
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.04.2012, 13:04
Ответы с готовыми решениями:

Получение значения ключевого поля GridView при событии RowEditing?
Стандартное редактирование строк компонента GridView мне не подходит. Поэтому пытаюсь обработать...

Почему после выполнения команды cprintf значения строк затираются?
Здраствуйте. Помогите пожалуйста, что это может быть, что вот уже больше дня играюсь с билдером и...

Получение ключевого поля только что добавленной записи
Здравствуйте! Имеется следующий код (MS SQL Server 2008) Поле id_data это поле с автоприращением....

Получение значения конкретного поля после SQL запроса
Нужно проверять введенный пароль и логин по MySQL базе и если пароль для данного логина правилен,...

32
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
02.04.2012, 16:50 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от _katon_ Посмотреть сообщение
Идентификатор мне необходим потому, что его значение будет использоваться далее для создания записей в других таблицах.
_katon_, Ну так он у тебя и так уже будет к тому времени, в нужной строке в нужной ячейке DataTable. Бери его оттуда и используй.
То что ты пытаешься сделать, очень напоминает изобретение велосипеда, только результатом этого изобретательства, как правило, становятся грабли.
0
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,079
02.04.2012, 17:29  [ТС] 22
Не пойму! Вы мне предлагаете отказаться от использования метод Insert() и работать непосредственно с активным DataTable (добавляя записи туда методом Add())?

Insert() по-моему не добавляет данные в datatable (нужен Fill()). А если так, то как даже после использования Fill() получить только, что добавленную строку?
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
03.04.2012, 14:57 23
_katon_, при использовании способа 1 в вашем выводе вы после обновления данных получите в той таблице, которую обновляли новые значения для столбцов-индендификаторов. сделайте Update для таблицы и посмотрите на нее! все необходимые данные уже есть! остается только вопрос в том, как найти те строки, которые были вставлены, но это уже совсем другой вопрос.
0
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,079
03.04.2012, 16:52  [ТС] 24
Это и есть сама проблема! Мне нужен ID, а как выбрать строку только, что вставленную от остальных и гарантировать что это именно та строка я не знаю.
0
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
03.04.2012, 17:05 25
_katon_, ты что-то мутное делаешь и уже сам походу во всем этом запутался. Метод Update адаптера берет таблицу, с которой связан, и проводит операции сохранения, обновления или удаления применительно к строкам в зависимости от того, какие манипуляции производились с ними до этого. И уж точно твой адаптер знать не должен (и не будет), какую строку ты и когда вставил. За этим должен следить именно ты, и после Update для нужной строки должен взять полученный ID из той строки, которую ты знаешь.
Вся твоя проблема на данный момент заключается в ошибочном подходе к обработке данных. Сядь, спроектируй нормально (можно на обычном листе бумаги диаграммку набросать), а затем уже реализуй кодом.
0
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,079
03.04.2012, 19:49  [ТС] 26
Я не согласен с вами, nio!
Изначально тема звучала так: Получение значения ключевого поля после выполнения команды TableAdapter.Insert().
В теме я спрашивал как с помощью этого метода вернуть ID созданной записи, поскольку поле ID генерируется базой и клиентское приложение (и адаптер в том числе) без понятия, какое значение будет присвоено полю ID.

И все!

В любом случае предлагаю прекратить дискуссию, так как пользы уже в ней не вижу!
0
124 / 106 / 7
Регистрация: 14.02.2010
Сообщений: 263
03.04.2012, 22:17 27
Цитата Сообщение от _katon_ Посмотреть сообщение
Я хочу чтобы инструкция TableAdapter.Insert возвращала мне не количество вставленных строк, а скалярное значение в виде идентификатора.
Идентификатор мне необходим потому, что его значение будет использоваться далее для создания записей в других таблицах.
Адаптер работает с таблицей, так? Ну так я и говорю, что поле id в таблице (DataTable) обновляется автоматом, не надо ничего возвращать и вручную писать.
0
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,079
03.04.2012, 22:59  [ТС] 28
У меня есть одна большая инструкция в которой организована определенная последовательность вставок записей в разные таблицы БД. Никакого интерфейса нет!!! Пользователь на время выполнения инструкции предоставляется прогресбар в котором отображается ход внесения данных в БД. Выполнилась вставка блока данных - полоска пододвинулась.

Все вносимые данные связаны между собой и поэтому создание всех последующих записей (в других таблицах) возможно только после определения значения первичного ключа только, что вставленной записи (для подстановки в поле вторичного ключа).

Кроме того - это не просто последовательность вставок, а сложный алгоритм осуществляющий проверку, после каждого шага, условий с целью определения последовательности вставки.

Пример
Чтобы создать заказ нужно знать ID заявки, вставка которой была осуществлена ранее.

Я ДОЛЖЕН использовать значения PK созданных записей чтобы создавать полностью валидные записи в других таблицах используя их в качестве FK.

По сути при таком подходе я абстрагируюсь от датасета потому, что именно этот участок безнесс-логики не требует модели с отключением.

Вот именно поэтому я использую метод Insert() чтобы просто вставит данны в таблицу на сервере (если посмотреть внутрь - он тупо выполняет запрос на вставку).
0
124 / 106 / 7
Регистрация: 14.02.2010
Сообщений: 263
04.04.2012, 12:57 29
Цитата Сообщение от _katon_ Посмотреть сообщение
Я ДОЛЖЕН использовать значения PK созданных записей чтобы создавать полностью валидные записи в других таблицах используя их в качестве FK.
Вполне тривиальная задача. Я тоже самое постоянно делаю. Так вот, id обновляется сам, если делать так, как я писал выше. Если в датасете настроена связь между таблицами, то id в дочерней таблице обновится автоматом.

Цитата Сообщение от _katon_ Посмотреть сообщение
Вот именно поэтому я использую метод Insert() чтобы просто вставит данны в таблицу на сервере (если посмотреть внутрь - он тупо выполняет запрос на вставку).
Думаю, не совсем правильно использовать для этих целей сгенерированный адаптер, да ещё и править его код. А так, дело хозяйское, я как бы не настаиваю
0
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,079
04.04.2012, 13:30  [ТС] 30
Цитата Сообщение от serg42 Посмотреть сообщение
Если в датасете настроена связь между таблицами, то id в дочерней таблице обновится автоматом.
Меня заинтересовала эта фраза. Но мне не совсем понятно, что вы имеете ввиду! Можно кусок кода в котором реализуется последовательность вставок?

Цитата Сообщение от serg42 Посмотреть сообщение
Думаю, не совсем правильно использовать для этих целей сгенерированный адаптер, да ещё и править его код. А так, дело хозяйское, я как бы не настаиваю
Кстати я отказался от правки автоматически генерируемого кода. А вот по поводу использования... Я пользуюсь потому, что не хочу выдумывать велосипед. Согласитесь если есть выбор между: писать свой запрос на вставку ил воспользоваться существующим, то логично склонится к последнему.
0
124 / 106 / 7
Регистрация: 14.02.2010
Сообщений: 263
04.04.2012, 22:06 31
Для другой БД будет немного отличаться, но суть та же.

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
DataSet ds = new DataSet();
DataTable tab1 = new DataTable("table1");
tab1.Columns.Add("id", typeof(int));
tab1.Columns.Add("name", typeof(string));
DataTable tab2 = new DataTable("table2");
tab2.Columns.Add("id", typeof(int));
tab2.Columns.Add("table1_id", typeof(int));
tab2.Columns.Add("name", typeof(string));
ds.Tables.Add(tab1);
ds.Tables.Add(tab2);
ds.Relations.Add(tab1.Columns["id"], tab2.Columns["table1_id"]);
 
MySqlConnection con = Engine.MySQL.GetConnection();
MySqlDataAdapter mda = new MySqlDataAdapter();
mda.InsertCommand = con.CreateCommand();
mda.InsertCommand.CommandText = "INSERT INTO table1 (name) VALUES (@name); SELECT id FROM table1 WHERE id = LAST_INSERT_ID();";
mda.InsertCommand.Parameters.Add("@name", MySqlDbType.String, 20, "name");
 
DataRow r1 = tab1.NewRow();
r1["id"] = 0;
r1["name"] = "test";
tab1.Rows.Add(r1);
 
DataRow r2 = tab2.NewRow();
r2["name"] = "test";
r2["table1_id"] = r1["id"];
tab2.Rows.Add(r2);
 
MessageBox.Show(tab2.Rows[0]["table1_id"].ToString());
mda.Update(tab1);
MessageBox.Show(tab2.Rows[0]["table1_id"].ToString());
0
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,079
04.04.2012, 22:28  [ТС] 32
Вот теперь я понял о чем вы мне толкуете. Спасибо большое! Иногда мне кажется, что я лучше понимаю код))))
0
11 / 11 / 8
Регистрация: 18.09.2012
Сообщений: 514
20.02.2014, 20:04 33
а то что оно выводит предупреждение "Не выполнен синтаксический разбор запроса" это нормально?? или я что то нетак делаю?
T-SQL
1
 SELECT @@IDENTITY
я вот это вписал
0
20.02.2014, 20:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.02.2014, 20:04
Помогаю со студенческими работами здесь

После выполнения определённой команды не выполняются последующие команды
Объясните, пожалуйста, почему может останавливаться выполнение второй и далее комманд? cd...

Изменение значения ключевого поля таблицы
Форумчане, доброго времени суток! Пользователь ошибочно ввел в ключевое поле типа счетчик ...

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

Сортировка элементов в линейном однонаправленном списке по возрастанию значения ключевого поля
Помогите написать подпрограмму сортировки элементов в линейном однонаправленном списке по...


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

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