Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2015, 17:28   #1
SeregaVili
Пользователь
 
Регистрация: 07.01.2013
Сообщений: 45
По умолчанию Получение значения идентификатора SQL при вставке, и вывод в переменную в C#

Здравствуйте. У меня возникла следующая проблема, мне нужно вставить запись в таблицу в БД, и вернуть Id добавленной записи (id - identity) в переменную в C#.
В Sql сервере создал следующую хранимую процедуру:
Код:
CREATE PROCEDURE InsertObjectWithDefect
@ObjectId int,
@EmployeeId int,
@Date Date,
@Identity int OUT
AS
INSERT INTO ObjectWithDefects (IdObject,IdEmployee,DateInformation) 
VALUES (@ObjectId,@EmployeeId,@Date)
SET @Identity=SCOPE_IDENTITY()
Как я понял, Scope_Identity как раз возвращает значение ID. НО как вывести это значение в переменную? Выполняю процедуру на C# следующим образом:
Код:
            int IdObject = _IdObject;
            int IdEmployee = _IdEmployee;
            DateTime Date = _Date.Date;

            connection.Open();

            SqlCommand command = connection.CreateCommand();
            command.CommandText = "InsertObjectWithDefect";
            command.CommandType = System.Data.CommandType.StoredProcedure;

            command.Parameters.Add("@ObjectId", System.Data.SqlDbType.Int).Value = IdObject;
            command.Parameters.Add("@EmployeeId", System.Data.SqlDbType.Int).Value = IdEmployee;
            command.Parameters.Add("@Date", System.Data.SqlDbType.Date).Value = Date;
            command.Parameters.Add("@Identity", ParameterDirection.Output).Value = 0;
            command.ExecuteNonQuery();
            
            connection.Close();
Как я понимаю нужно что то сделать вместо ExecuteNonQuery, но что?
SeregaVili вне форума Ответить с цитированием
Старый 11.11.2015, 17:33   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

https://msdn.microsoft.com/en-us/lib...=vs.110).aspx:
Цитата:
any output parameters or return values mapped to parameters are populated with data.
Тоесть:
Код:
            command.Parameters.Add("@ObjectId", System.Data.SqlDbType.Int).Value = IdObject;
            command.Parameters.Add("@EmployeeId", System.Data.SqlDbType.Int).Value = IdEmployee;
            command.Parameters.Add("@Date", System.Data.SqlDbType.Date).Value = Date;
            command.Parameters.Add("@Identity", ParameterDirection.Output).Value = 0;
            command.ExecuteNonQuery();

int n=command.Parameters["@Identity"].value;
Ну или типа такого.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.11.2015, 17:44   #3
SeregaVili
Пользователь
 
Регистрация: 07.01.2013
Сообщений: 45
По умолчанию

Спасибо, за быстрый ответ, попробовал но возвращается постоянно ноль.
Код:
int n = (int)command.Parameters["@Identity"].Value;
MessageBox.Show(Convert.ToString(n));
Хотя в БД добавляется с нормальными Id
SeregaVili вне форума Ответить с цитированием
Старый 11.11.2015, 17:52   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Тут я уже не подскажу...
Я не вижу BEGIN и END для процедуры, может в твоей СУБД так и надо, но х.з...
Попробуй напиши
Код:
SET @Identity=3
И посмотри вернется ли тройка.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.11.2015, 18:04   #5
SeregaVili
Пользователь
 
Регистрация: 07.01.2013
Сообщений: 45
По умолчанию

Попробовал как вы посоветовали, вернуло ноль и тут я понял в чем дело) Нужно было убрать вот это:
Код:
command.Parameters.Add("@Identity", ParameterDirection.Output).Value = 0;
и оставить просто это:
Код:
command.Parameters.Add("@Identity", ParameterDirection.ReturnValue);
Output заменил на ReturnValue просто так,
И вернуло тройку. Спасибо, Stilet

Последний раз редактировалось SeregaVili; 11.11.2015 в 18:09.
SeregaVili вне форума Ответить с цитированием
Старый 11.11.2015, 19:02   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да не за что
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение идентификатора самого "позднего" документа Luuzuk SQL, базы данных 9 31.07.2015 21:11
Получение идентификатора картинки из url Arsenx777 PHP 0 22.04.2012 18:53
Получение значения при вводе определенного значения armanmal Microsoft Office Excel 6 21.11.2011 17:30
Получение идентификатора кодировки по названию Lindemann66 Общие вопросы C/C++ 0 02.08.2011 13:37
Присвоить разные значения параметру при вставке записи в базу Gover БД в Delphi 3 19.04.2010 21:37