这是我的存储过程
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进行进一步处理。
感谢您的帮助。
答案 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