0

这是我的存储过程

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 进行进一步处理。

感谢您的帮助。

4

2 回答 2

4

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

newID = (int)cmd.ExecuteScalar();

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

SELECT SCOPE_IDENTITY()

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


如果要保留返回类型,则需要在命令中添加返回类型参数,像当前一样以非查询方式执行,然后读取返回参数的值,如从存储过程中获取返回值中所述在 C#中。

于 2012-10-22T15:49:09.127 回答
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
于 2012-10-23T08:31:33.453 回答