2015-07-14 3 views
1

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

Alter Proc Proc1 
    @name varchar(10), 
    @value int 
As 
Begin 
    insert into Table1 
    values (@name, @value) 

    return SCOPE_IDENTITY() 

C# код:

У меня есть метод, чтобы назвать мою базу данных каждый раз, так что я использую, что

_database.StoredProcedure = "Proc1"; 
_database.parameter("name","michael"); 
_database.parameter("value",10); 

int id = Convert.ToInt32(_database.ExecuteScalar()); 

Здесь я получаю ID = 0 каждый раз // BUG

SQL Другие хранимые процедуры:

Alter Proc2 
// Some other logic 
Execute @id = Proc1 @name, @value // THIS WORKS 

Теперь, если я меняю последнюю строку PROC1, чтобы Select SCOPE_IDENTITY() из RETURN SCOPE_IDENTITY() затем # код работает C, но Proc2 возвращает 0.

Что я должен сделать так, чтобы он работает в C# код и в proc2 также.

Я думал о выходном параметре, но я не знаю, как бы назвать его с помощью этого метода базы данных в C#.

+2

никогда не использовать возврат за все, кроме кода ошибки или кода состояния, другими словами, он предназначен только для метаданных. Вы должны использовать выходную переменную в любое время, когда вы возвращаете фактические данные из таблицы базы данных. – HLGEM

+0

Возможный дубликат [Параметр возвращаемого значения SqlCommand] (http://stackoverflow.com/questions/12885818/sqlcommand-return-value-parameter) – Taekahn

+0

@Steve Если я делаю, выберите SCOPE_IDENTITY(), **, тогда идентификатор Proc2 из Proc2 возвращает 0. ** –

ответ

0

Изменить ваше тело процедуры нравится ниже, чтобы изменить RETURN заявление SELECT SCOPE_IDENTITY()

Alter Proc Proc1 
@name varchar(10), 
@value int 
As 
Begin 
insert into Table1 values (@name,@value); 
SELECT SCOPE_IDENTITY(); 
END 

В этом случае, сделать его выходной параметр и установить, что выходной параметр для scope_identity

Alter Proc Proc1 
@name varchar(10), 
@value int, 
@ID INT OUTPUT 
As 
Begin 
insert into Table1 values (@name,@value); 
SET @ID = SCOPE_IDENTITY(); 
END 

You может позвонить по процедуре

cmd.Parameters.Add("@ID", SqlDbType.Int, 0, "ID"); 
cmd.Parameters["@ID"].Direction = ParameterDirection.Output; 
conn.Open(); 
cmd.ExecuteNonQuery(); 
int id = (int)cmd.Parameters["@ID"].Value; 
+0

Если я делаю выбор SCOPE_IDENTITY(), то идентификатор Proc2 из Proc2 возвращает 0. –

+0

В этом случае сделайте его выходным параметром и установите этот выходной пааметр в scope_identity – Rahul

4

Если вы хотите, чтобы данные были вне процедуры, правильная вещь должна использовать выходные параметры. НЕ используйте return_value из своих процедур. Это значение указывает статус выполнения, а не данные процедуры.

Вот пример того, как это может выглядеть.

Alter Proc Proc1 
@name varchar(10), 
@value int, 
@IdentityValue int OUTPUT 

As 
Begin 
    insert into Table1 values (@name,@value) 
    Select @IdentityValue = SCOPE_IDENTITY() 
END 
select * from table1 
GO 

Alter Proc2 
(
    @name varchar(10) 
    , @value int 
    , @IdentityValue int OUTPUT 
) 
as 
    //SOme other logic 
    declare @IdentityValue int 
    Execute Proc1 @name, @value, @IdentityValue OUTPUT 

GO 

Также обратите внимание, что у вас есть вставка в Proc1, но вы не указываете столбцы. Это очень плохая практика. Если ваша структура таблицы изменится, ваша процедура нарушена. Вы должны ВСЕГДА указывать столбцы в своей вставке.

+0

Что мне делать в моем C# Code, тогда , Если я передам его как параметр '_database.Paramater (« IdentityValue », id); _database.ExecuteNonQuery(); '. то значение id равно 0. –

+0

Вы должны добавить направление параметра. –

Смежные вопросы