首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Output参数返回零,而存储过程返回受影响的行数

Output参数返回零,而存储过程返回受影响的行数
EN

Stack Overflow用户
提问于 2018-05-11 19:52:01
回答 1查看 175关注 0票数 1

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

我的存储过程是这样的:

代码语言:javascript
复制
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#代码:

代码语言:javascript
复制
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"));

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

EN

回答 1

Stack Overflow用户

发布于 2018-05-17 10:37:16

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

我找到了返回0的原因,我正在使用另一个SP生成sequenceId (此问题中未提及),并将该值作为主键传递到此CM.tb_ApplicationUser表中。当我注释该行并将一些值传递到CM.tb_ApplicationUser表中时。所以它返回@@Rowcount或者其他任何值,

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

在这种情况下,我理解多次DML尝试可能会导致获取@@ROWCOUNT的问题。DML查询将工作得很好,它将影响表,但我们无法在代码端获得所需的输出(ExecuteDataReader或其他)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50291740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档