我正在做一个用户注册页面。插入用户存储过程工作正常,在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"));任何建议都对我有帮助。我不明白这有什么不对的。此方法适用于项目的其他插入。
发布于 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或其他)。
https://stackoverflow.com/questions/50291740
复制相似问题