【问题标题】:How to capture the newly inserted row's ID value from C#?如何从 C# 中捕获新插入的行 ID 值?
【发布时间】:2012-10-22 15:46:00
【问题描述】:

这是我的存储过程

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

感谢您的帮助。

【问题讨论】:

    标签: tsql


    【解决方案1】:

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

    newID = (int)cmd.ExecuteScalar();
    

    为了使上述操作生效,您还需要将 SQL 从返回返回值更改为 选择该值:

    SELECT SCOPE_IDENTITY()
    

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


    如果要保留返回类型,则需要在命令中添加一个返回类型参数,像现在一样作为非查询执行,然后读取返回参数的值,如Getting return value from stored procedure in C#中所述.

    【讨论】:

    • 我收到“对象引用未设置为对象实例”异常。
    • 那不是要求SELECT SCOPE_IDENTITY()返回值(而不是使用RETURN关键字?)
    • 在我将关键字从 RETURN 更改为 SELECT 后,我得到一个不同的错误异常:“Specified cast is not valid.”
    • @Richard77 - 期望值是多少?它是否在int 的范围内?如果返回的值不是整数,我预计会出现该错误。
    • @Richard77 - 这样就可以了……而且是 Oded,而不是 Obed。
    【解决方案2】:

    您需要传递 [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
    

    【讨论】:

      猜你喜欢
      • 2020-10-31
      • 1970-01-01
      • 2019-11-02
      • 1970-01-01
      • 2015-03-01
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多