输出参数返回零,而存储过程返回受影响的行计数



我正在做一个用户注册页面。插入用户存储过程工作正常,在 SQL Server 和配置文件查看器中,输出参数返回@@Rowcount,从 C# 调用此存储过程时,它始终返回"0"。

我的存储过程是这样的:

ALTER PROCEDURE [CM].[usp_InsertUser] 
@pEncrUserId            NVARCHAR(max),
@pApplicationTypeId     BIGINT,
@pLanguageId            BIGINT,
@pUsername              VARCHAR(15),
@pPassword              NVARCHAR(max),
@pRecoverEmail          VARCHAR(128),   
@pCreatedBy             BIGINT,
@pReturnId              INT OUTPUT ,
@pErrorMessage          NVARCHAR(Max) OUTPUT    
AS
BEGIN TRY     
INSERT INTO [CM].[tb_ApplicationUser] ([EncrUserId], [ApplicationTypeId],[LanguageId], 
[UserName], [UserPassword], [RecoverEmail], 
[CreatedBy], [StatusId], [ConcurId])
VALUES (@pEncrUserId, @pApplicationTypeId, @pLanguageId,
@pUsername, @pPassword, @pRecoverEmail,
@pCreatedBy, 1, NEWID())
SET @pReturnId = @@ROWCOUNT 
END TRY
BEGIN CATCH
SET @pReturnID = @@ERROR;
SET @pErrorMessage  = ERROR_MESSAGE();
END CATCH

还有我的 C# 代码:

cmd = dbClient.GetCommand("cm.usp_InsertUser", CommandType.StoredProcedure);
dbClient.AddParameter(cmd, "@pEncrUserId", DALayer.EnumEx.DBDataTypes.NVarChar, ParameterDirection.Input, 0, objInput.EncrUseId);
dbClient.AddParameter(cmd, "@pApplicationTypeId", DALayer.EnumEx.DBDataTypes.BigInt, ParameterDirection.Input, 150, objInput.ApplicationtypeId);
dbClient.AddParameter(cmd, "@pLanguageId", DALayer.EnumEx.DBDataTypes.BigInt, ParameterDirection.Input, 150, objInput.LanguageId);
dbClient.AddParameter(cmd, "@pUsername", DALayer.EnumEx.DBDataTypes.VarChar, ParameterDirection.Input, 15, objInput.UserName);
dbClient.AddParameter(cmd, "@pPassword", DALayer.EnumEx.DBDataTypes.NVarChar, ParameterDirection.Input, 0, objInput.Password);
dbClient.AddParameter(cmd, "@pRecoverEmail", DALayer.EnumEx.DBDataTypes.VarChar, ParameterDirection.Input, 150, objInput.RecoverEmail);
dbClient.AddParameter(cmd, "@pCreatedBy", DALayer.EnumEx.DBDataTypes.BigInt, ParameterDirection.Input, 150, objInput.CreatedBy);
dbClient.AddParameter(cmd, "@pReturnId", DALayer.EnumEx.DBDataTypes.BigInt, ParameterDirection.Output, 150);
dbClient.AddParameter(cmd, "@pErrorMessage", DALayer.EnumEx.DBDataTypes.NVarChar, ParameterDirection.Output, 150);
IDataReader dsTemp = dbClient.ExecuteDataReader(cmd);
returnID = Convert.ToInt64(dbClient.GetParameterValue(cmd, "@pReturnId"));

任何建议对我都有帮助。我不明白这有什么问题。此方法适用于项目的其他插入。

感谢您贡献宝贵的知识和时间。

我找到了它返回 0 的原因,我正在使用另一个 SP 来生成 sequenceId(这个问题中没有提到(并将该值作为主键传递到这个 [CM]。[tb_ApplicationUser] 表。当我注释该行并将一些值传递给 [CM] 时。[tb_ApplicationUser] 表。所以它返回@@Rowcount或任何完美的值,

returnID = Convert.ToInt64(dbClient.GetParameterValue(cmd, "@pReturnId"));

在这种情况下,我知道多次DML尝试可能会使@@ROWCOUNT出现问题。DML 查询将正常工作,它会影响表,但我们无法在代码端(ExecuteDataReader 或其他(获得所需的输出。

相关内容

  • 没有找到相关文章

最新更新