如何从C#中捕获新插入的行的ID值?

时间:2012-10-22 15:46:00

标签: tsql

这是我的存储过程

ALTER PROCEDURE dbo.spInsertNewTask
@ModuleID               int, 
@Task                   varchar(50), 
@StartDate              date, 
@PlannedEndDate         date, 
@EstimatedEndDate       date, 
@Status                 int,
@Comments               varchar(500),
@Started                bit
AS
INSERT INTO DTasks (ModuleID, Task, StartDate, PlannedEndDate, EstimatedEndDate, Status, Comments, Started, LastUpdated)
VALUES (@ModuleID, @Task, @StartDate, @PlannedEndDate, @EstimatedEndDate, @Status, @Comments, @Started, GETDATE())

RETURN SCOPE_IDENTITY()

当我尝试捕获新创建的ID时,我得到的总是1.如何捕获新行的ID?

newID = cmd.ExecuteNonQuery();

事实上,我需要这个新ID进行进一步处理。

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

而不是返回受影响行数的ExecuteNonQuery,您应该使用ExecuteScalar,将返回的object转换为正确的类型:

newID = (int)cmd.ExecuteScalar();

要使上述工作正常,您还需要更改SQL,将返回值返回到选择值:

SELECT SCOPE_IDENTITY()

页面上的代码示例几乎就是您要做的事情。


如果要保留返回类型,则需要在命令中添加返回类型参数,按照当前的非查询执行,然后读取返回参数的值,如{{3 }}

答案 1 :(得分:1)

您需要传递[ID],假设它是您的标识列作为输出参数:

在C#中,您需要添加新参数作为输出参数,并在执行结束时检索:

初​​始化:

    SqlParameter param = new SqlParameter("@ID", 0);
    param.Direction = ParameterDirection.Output;
    param.DbType = DbType.Int32;

执行后检索:

    int id = Convert.ToInt32(sqlcommand.Parameters["@ID"].Value.ToString());

存储过程:

    ALTER PROCEDURE dbo.spInsertNewTask
        @ID                     INT = NULL OUTPUT,
        @ModuleID               int, 
        @Task                   varchar(50), 
        @StartDate              date, 
        @PlannedEndDate         date, 
        @EstimatedEndDate       date, 
        @Status                 int,
        @Comments               varchar(500),
        @Started                bit
    AS
    BEGIN
        INSERT INTO DTasks (ModuleID, Task, StartDate, PlannedEndDate, EstimatedEndDate, Status, Comments, Started, LastUpdated)
        VALUES (@ModuleID, @Task, @StartDate, @PlannedEndDate, @EstimatedEndDate, @Status, @Comments, @Started, GETDATE())

        SET @ID = SCOPE_IDENTITY()
    END 
    GO