获取最后一个插入行的id

时间:2013-10-09 18:12:12

标签: c# sql-server stored-procedures

我在这里看到的解决方案很少,但都没有效果。我试过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的值。任何帮助赞赏

谢谢

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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来返回命令插入的行。之后,使用带有ExecuteScalar的SELECT SCOPE_IDENTITY()命令文本运行一个新命令。当然,如果您无法修改SP,如果您可以更改proc,则th1rdey3的答案会更好,因为它可以避免数据库的运行。