Выходной параметр возвращает ноль, в то время как хранимая процедура возвращает количество затронутых строк - PullRequest
0 голосов
/ 11 мая 2018

Я делаю страницу регистрации пользователя. Вставка пользовательской хранимой процедуры работает отлично, и в 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"));

Любой совет полезен для меня. Я не могу понять, что в этом плохого. Этот метод работает в других вставках проекта.

1 Ответ

0 голосов
/ 17 мая 2018

Спасибо за предоставление ваших ценных знаний и времени.

Я нашел причину, по которой он возвращает 0, я использую другой SP для генерации sequenceId (который не упоминается в этом вопросе) и передаю это значение в качестве первичного ключа в этой таблице [CM]. [Tb_ApplicationUser]. когда я комментирую эту строку и передаю некоторое значение в таблицу [CM]. [tb_ApplicationUser]. Таким образом, он возвращает @@ Rowcount или любое другое значение,

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

В этом случае я понимаю, что многократная попытка DML может создать проблему для получения @@ ROWCOUNT. DML-запрос будет работать нормально, и это повлияет на таблицу, но мы не можем получить желаемый результат на стороне кода (ExecuteDataReader или другое).

...