2013-10-09 5 views
0

Я видел здесь несколько решений, но никто не работал. Я пробовал SCOPE_IDENTITY() не wotk. id - автоинкремент.получить идентификатор последней вставленной строки в

Это моя хранимая процедура

CREATE PROCEDURE [dbo].[uploadVid] 
    @video varbinary(MAx), 
    @vidTitle varchar(50), 
    @vidCategory varchar(50), 
    @vidDate date, 
    @vidDescription varchar(Max), 
    @vidName varchar(50), 
    @vidSize bigint 
AS 

INSERT INTO Video(video, vidTitle, vidCategory, vidDate, vidDescription, vidName, vidSize) 
VALUES (@video, @vidTitle, @vidCategory, @vidDate, @vidDescription, @vidName, @vidSize) 

& в задней части я попытался

Object i = register.ExecuteScalar(); 

&

int newId = (Int32)register.ExecuteScalar(); 

я ставлю точку останова, и это дало мне значение null или 0. любая помощь оценивается

Благодаря

+0

Какую базу вы используете? – Steve

+1

Рассмотрите возможность использования «выходного параметра» для возврата нового идентификатора, поскольку возвращаемое значение используется для обработки ошибок: http://stackoverflow.com/questions/3142444/stored-procedure-return-identity-as-output-parameter- или-scalar –

+0

Вызов хранимой процедуры из примера ADO.NET здесь: http://msdn.microsoft.com/en-us/library/59x02y99 –

ответ

3

попробовать это

CREATE PROCEDURE [dbo].[uploadVid] 
    @video varbinary(MAx), 
    @vidTitle varchar(50), 
    @vidCategory varchar(50), 
    @vidDate date, 
    @vidDescription varchar(Max), 
    @vidName varchar(50), 
    @vidSize bigint 
AS 
begin 

declare @id as int --assuming your identity column is int 

INSERT INTO Video(video, vidTitle, vidCategory, vidDate, vidDescription, vidName, vidSize) 
VALUES (@video, @vidTitle, @vidCategory, @vidDate, @vidDescription, @vidName, @vidSize) 

set @id = scope_identity() 
select @id --return the value for executescaler to catch it 
end 
0

Вероятно, вы не выполнять команды в правильной последовательности: (предположим, что вы используете БД SQL Server)

SqlCommand cmd = new SqlCommand("uploadVid", connnection); 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Parameters.Add(.....) 
...... 
// After adding the parameters you execute the command to insert the new row.... 
int rowsInserted = cmd.ExecuteNonQuery(); 
if(rowsInserted > 0) 
{ 

    SqlCommand cmd1 = new SqlCommand("SELECT SCOPE_IDENTITY()", connection); 
    int newID = (int)cmd1.ExecuteScalar(); 
} 

ExecuteScalar только возвращает значение первой строки в первом столбце выполненного запроса. В случае вставки это значение не имеет смысла. Вам нужен ExecuteNonQuery, который возвращает строки, вставленные командой. После этого запустите новую команду с текстом команды SELECT SCOPE_IDENTITY() с помощью ExecuteScalar. Это, конечно, если вы не можете изменить SP, ответ от th1rdey3 лучше, если вы можете изменить proc, потому что он позволяет избежать прогона базы данных.

+0

Не нужно выполнять другой SqlCommand, возвращая SCOPE_IDENTITY() из хранимой процедуры, следует делать Хитрость. См. Ответ th1rdey3. –

+0

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

+0

Он не сказал нам, может ли он изменить СП. Если он не может, вы правы, это способ сделать. И я сожалею об этом. Но если он может, этот способ не рекомендуется, потому что вы можете вернуть идентификатор только одной командой. –

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