ExecuteNonQuery () retorna -1 na atualização quando os registros são atualizados

StackOverflow https://stackoverflow.com/questions/2203100

  •  18-09-2019
  •  | 
  •  

Pergunta

eu tenho verificado que o meu método de procedimento / Oracle está funcionando corretamente, mas na minha C # eu sempre fico -1 retornou de ExecuteNonQuery (). Consequentemente, o bool abaixo é sempre falsa. Nós só usamos Triggers em nosso DB (Oracle) para instruções INSERT. Preciso de um gatilho para uma instrução de atualização?

Todas as sugestões por que isso iria acontecer? Sua definitivamente atualizar um registro:

public bool ChangePassword(long UserId, string NewPassword)
    {
        int rcds = 0;
        using (OracleConnection dbConn = new OracleConnection(dbConnString))
        using (OracleCommand dbCmd = new OracleCommand("PKG_USER.CHANGE_PASSWORD", dbConn))
        {
            try
            {
                string salt = GenerateSalt();
                dbCmd.CommandType = CommandType.StoredProcedure;
                dbCmd.Parameters.Add("p_USER_ID", OracleDbType.Int64, UserId, ParameterDirection.Input);
                dbCmd.Parameters.Add("P_PASSWORD", OracleDbType.Varchar2, 128, EncodePassword(NewPassword, this.IsPasswordHashed, salt), ParameterDirection.Input);
                dbCmd.Parameters.Add("P_PASSWORD_SALT", OracleDbType.Varchar2, 128, salt, ParameterDirection.Input);

                if (dbConn.State != ConnectionState.Open) dbConn.Open();
                rcds = dbCmd.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                LastError = e.Message + " " + e.Source;
                rcds = 0;
            }
            finally
            {
                dbCmd.Dispose();
                dbConn.Dispose();
            }
        }
        return (rcds > 0);
    }

Desculpe ... Aqui está o SP:

  PROCEDURE Change_Password(p_User_Id       IN Users.User_Id%TYPE,
                        p_Password      IN Users.Password%TYPE,
                        p_Password_Salt IN Users.Password_Salt%TYPE) IS


BEGIN
UPDATE Users
   SET Password             = p_Password,
       Password_Salt        = p_Password_Salt,
       Password_Change_Date = SYSDATE
 WHERE User_Id = p_User_Id;

FIM change_password;

Foi útil?

Solução

Tente explicitamente retornar SQL% ROWCOUNT.

De acordo com MSDN, DbCommand..ExecuteNonQuery sempre retornará -1 para chamadas de procedimento armazenado:

Para UPDATE, INSERT, e instruções DELETE, o valor de retorno é o número de linhas afetadas pelo comando. Para todos os outros tipos de declarações, o valor de retorno é -1.

Se bem me lembro dos meus tempos de utilização de lotes de procedimentos armazenados, eu acredito que você precisa usar um argumento de saída para retornar coisas como o número de linhas atualizadas.

Outras dicas

Eu não sou um cara Oracle, mas aparentemente há um comando:

set feedback off

que a impede de retornar a contagem de registros afetados. É esta linha no procedimento armazenado? Ou você já tentou 'gabarito set on'? Funcionalmente Acho que este é apenas o inverso do comando SET NOCOUNT ON / OFF do SQL Server.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top