Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/10: Рейтинг темы: голосов - 10, средняя оценка - 4.60
fenix117
8 / 8 / 2
Регистрация: 16.03.2011
Сообщений: 249
1

Как получить id после добавления записи средствами ADO

08.01.2013, 16:16. Просмотров 1961. Ответов 12
Метки нет (Все метки)

Здравствуйте, помогите разобраться: после добавления в базу данных записи (TableAdapter.Insert) мне нужно получить id этой записи. Как это сделать желательно средствами ADO (может быть есть специальный метод у адаптера который я упустил). Если нельзя, то как вызвать SQL запрос. Сам запрос я сумею написать, а вот как его вызвать я не знаю.

Спасибо за внимание.))
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2013, 16:16
Ответы с готовыми решениями:

Как получить id после добавления записи?
Вот код где добавляю запись и хочу получить айди. Сердце чует что-то не то делаю:wall: Подскажите,...

ADO.NET и Stored procedure для добавления новой записи.
У меня следующая проблема. Разрабатываю приложение под WinForms. Использую VS2008 & SQLExpress...

Обновление dataGrid сразу после добавления/удаления записи, а не после перезапуска приложения
Здравствуйте, написал в с# процедуры на добавление и удаления данных, при нажатии соответственных...

Выборка id, после добавления записи в БД
Привет, как правильно составить запрос, чтобы получить ID? Ниже код добавляет запись в таблицу БД,...

Как обновить datagridview после добавления записи?
Как можно обновить datagridview после добавленич записи? string connectionString =...

12
nio
5969 / 3375 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
08.01.2013, 16:55 2
fenix117, для начала следовало сказать с какой БД работаешь
Вот для SQL SERVER
Написать процедуру в MSQL которая будет вставлять строку в таблицу act_new и возвращать параметр id
Получение значения ключевого поля после выполнения команды TableAdapter.Insert()
1
fenix117
8 / 8 / 2
Регистрация: 16.03.2011
Сообщений: 249
08.01.2013, 19:18  [ТС] 3
Понравилось решение Vovavov:
C#
1
2
3
4
xxxTableAdapter.Connection.Open();
xxxTableAdapter.Insert(.........);
int ID=Convert.ToInt32(xxxTableAdapter.GetIDQuery());
xxxTableAdapter.Connection.Close();
А GetIDQuery - это я так назвал запрос, который создаётся так - правая мышь на xxxTableAdapter в файле .xsd - Добавить запрос - Использовать инструкции SQL - Далее - Инструкция Select, возвращающая одиночное значение - Далее - Вставляешь запрос SELECT @@IDENTITY - Далее - Задаёшь имя запроса - GetIDQuery - Далее - Готово
Запрос все время возвращает null((
Пробовал
SELECT @@IDENTITY
SELECT SCOPE_IDENTITY()
SELECT SCOPE_IDENTITY() FROM applicant
Ничего не выходит((

Добавлено через 52 минуты
Я неправильно пишу запрос? Помогите, в чем может быть проблема?
0
ksk
614 / 482 / 43
Регистрация: 05.07.2010
Сообщений: 1,589
08.01.2013, 19:28 4
В чистом виде на SQL работает SELECT SCOPE_IDENTITY(), это был правильный совет.
NULL может получиться в случае, если инсертимая таблица не имела автоинкрементного поля.
Я бы воспользовался профайлером для отладки этой части.

TableAdapter позволяет переопределить инсертящую процедуру.
В ней можно сделать SELECT SCOPE_IDENTITY() после инстерта.
Но потом его надо как-то получить в приложение. Должен быть способ.
1
08.01.2013, 19:28
fenix117
8 / 8 / 2
Регистрация: 16.03.2011
Сообщений: 249
08.01.2013, 21:13  [ТС] 5
автоинкрементное поле есть
0
fenix117
8 / 8 / 2
Регистрация: 16.03.2011
Сообщений: 249
08.01.2013, 21:58  [ТС] 6
id_applicant
0
Миниатюры
Как получить id после добавления записи средствами ADO  
kodv
1430 / 1103 / 344
Регистрация: 11.04.2011
Сообщений: 2,606
Завершенные тесты: 1
09.01.2013, 02:27 7
fenix117, в этих темах все написано. Все дело в том, что ADO.NET открывает соединение с БД только на время выполнения команд. Соответственно, у вас команды вставки и получения последнего идентификатора происходят в разных сессиях. Лучше вам запихивать код для получения последнего идентификатора в команду вставки. Если вы будете возвращть значение последнего идентификатора через выходной параметр, который будет связан со столбцом идентификатора вашей таблицы в C#, то вам в коде вообще ни каких дополнительных присваиваний делать не прийдется, C# все сделает за вас.
1
fenix117
8 / 8 / 2
Регистрация: 16.03.2011
Сообщений: 249
09.01.2013, 19:38  [ТС] 8
Реализовывать процедуру, возвращающую идентификатор не хочется, т.к. стандартный insert возвращает количество добавленных в базу записей и я этим пользуюсь для проверки (кстати что вернет процедура в случае если запись не была добавлена?).
Вот так я добавляю запись сперва в базу а потом и в dataset
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
main.aTA.Connection.Open();
                int i = main.aTA.Insert(surnameTextBox.Text, nameTextBox.Text, patronymicTextBox.Text,
                    DateTime.Now, type_of_educationComboBox.Text, specialtyTextBox.Text, experienceComboBox.Text,
                    Convert.ToInt32(salaryTextBox.Text), Convert.ToInt16(ageTextBox.Text), sexComboBox.Text, comments,
                    address, phoneTextBox.Text, e_mailTextBox.Text, 0, false);
                int ID = Convert.ToInt32(main.aTA.GetIDQuery());
                main.aTA.Connection.Close();
                if (i == 1)
                {
                    DataRow A = main.DS.applicant.NewRow();
                    A["id_applicant"] = ID;
                    A["surname"] = surnameTextBox.Text;
                    A["name"] = nameTextBox.Text;
                    A["patronymic"] = patronymicTextBox.Text;
                    A["date_of_registration"] = DateTime.Now;
                    A["type_of_education"] = type_of_educationComboBox.Text;
                    A["specialty"] = specialtyTextBox.Text;
                    A["experience"] = experienceComboBox.Text;
                    A["salary"] = Convert.ToInt32(salaryTextBox.Text);
                    A["age"] = Convert.ToInt16(ageTextBox.Text);
                    A["sex"] = sexComboBox.Text;
                    A["comments"] = comments;
                    A["address"] = address;
                    A["phone"] = phoneTextBox.Text;
                    A["e_mail"] = e_mailTextBox.Text;
                    A["number_of_interviews"] = 0;
                    A["deleted"] = false;
                    main.DS.applicant.Rows.Add(A);
                    this.Close();
                }
                else
                {
                    MessageBox.Show("Количество добавленных записей в базу данных равно " + i, "Ошибка!");
                }
Также нашел такую вещь в DataSet.Designer.cs, но там что либо менять я боюсь
C#
1
2
this._adapter.InsertCommand.CommandText = @"INSERT INTO [dbo].[applicant] ([surname], [name], [patronymic], [date_of_registration], [type_of_education], [specialty], [experience], [salary], [age], [sex], [comments], [address], [phone], [e_mail], [number_of_interviews], [deleted]) VALUES (@surname, @name, @patronymic, @date_of_registration, @type_of_education, @specialty, @experience, @salary, @age, @sex, @comments, @address, @phone, @e_mail, @number_of_interviews, @deleted);
SELECT id_applicant, surname, name, patronymic, date_of_registration, type_of_education, specialty, experience, salary, age, sex, comments, address, phone, e_mail, number_of_interviews, deleted FROM applicant WHERE (id_applicant = SCOPE_IDENTITY())";
Буду признателен если вы мне напишите запрос для моего случая и что с ним делать, я новичок в бд, sql и c#. Я окончательно запутался.='(
0
kodv
1430 / 1103 / 344
Регистрация: 11.04.2011
Сообщений: 2,606
Завершенные тесты: 1
10.01.2013, 09:56 9
Цитата Сообщение от fenix117 Посмотреть сообщение
Также нашел такую вещь в DataSet.Designer.cs, но там что либо менять я боюсь
Осталось теперь найти такую вещь, как DataSet.xsd ))
1
fenix117
8 / 8 / 2
Регистрация: 16.03.2011
Сообщений: 249
10.01.2013, 12:35  [ТС] 10
Цитата Сообщение от kodv Посмотреть сообщение
Осталось теперь найти такую вещь, как DataSet.xsd ))
Через нее я и создавал запрос (и он возвращает все время null)
0
Миниатюры
Как получить id после добавления записи средствами ADO  
kodv
1430 / 1103 / 344
Регистрация: 11.04.2011
Сообщений: 2,606
Завершенные тесты: 1
10.01.2013, 19:30 11
fenix117, Там же есть и тот запрос, который вы нашли в DataSet.Designer.cs. в XSD файле можете править его без особых опасений, что весь проект сломается.
1
fenix117
8 / 8 / 2
Регистрация: 16.03.2011
Сообщений: 249
10.01.2013, 21:53  [ТС] 12
Цитата Сообщение от kodv Посмотреть сообщение
fenix117, Там же есть и тот запрос, который вы нашли в DataSet.Designer.cs. в XSD файле можете править его без особых опасений, что весь проект сломается.
Есть только Fill, GetData(), больше студия ничего не создала.

Добавлено через 1 час 39 минут
Разобрался:
Заработала вот эта штука: IDENT_CURRENT('table_name')
0
turbanoff
Эксперт Java
4029 / 3764 / 743
Регистрация: 18.05.2010
Сообщений: 9,330
Записей в блоге: 11
Завершенные тесты: 1
11.01.2013, 07:18 13
Цитата Сообщение от fenix117 Посмотреть сообщение
IDENT_CURRENT
Эта функция не гарантирует, что вы получите именно ID вашей записи. Она возвращает последний ID в таблице, причем он может быть добавлен в другой сессии.
Разберитесь со SCOPE_IDENTITY, чтобы потом не ловить странных багов.

Добавлено через 5 минут
Вот тут советуют выставить ExecuteMode - Scalar, тогда TableAdapter.Insert будет возвращать ID добавленной строки
1
11.01.2013, 07:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2013, 07:18

Автоматическое добавление записи в таблицу, после добавления записи в другой таблице
Привет всем! Подскажите, как Access 2010 сделать так, чтобы при добавлении записи в одной таблице,...

Обновить записи в первой форме, после добавления записи во второй
Всё сдаюсь. Помогите... вот пример, что бы было понятнее Есть таблица "ПеремещениеТехники" ...

Как получить значение поля счетчика после добавления через rst.AddNew ?
Добрый день всем. Есть таблица, в ней, само собой, первое поле - Код (счетчик), и несколько...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru