ExecuteNonQuery () devuelve -1 en la actualización cuando se actualizan los registros

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

  •  18-09-2019
  •  | 
  •  

Pregunta

He verificado que mi método de procedimiento / Oracle está funcionando correctamente, pero en mi C # siempre me -1 volver de ExecuteNonQuery (). En consecuencia, el bool abajo siempre es falsa. Sólo utilizamos disparadores en nuestra base de datos (Oracle) para las instrucciones INSERT. ¿Es necesario un disparador para una instrucción de actualización?

Cualquier sugerencia razón por la que pasaría? Su definitivamente la actualización de un 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);
    }

Lo siento ... aquí está el 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;

FIN change_password;

¿Fue útil?

Solución

Trate de regresar de forma explícita SQL% ROWCOUNT.

De acuerdo con MSDN, DbCommand..ExecuteNonQuery siempre devolverá -1 para el procedimiento almacenado llama:

  

Para UPDATE, INSERT y DELETE, el valor de retorno es el número de filas afectadas por el comando. Para todos los demás tipos de declaraciones, el valor de retorno es -1.

Si mal no recuerdo de mis días de usar una gran cantidad de procedimientos almacenados, creo que tendría que utilizar un argumento de salida para devolver cosas como el número de filas actualizadas.

Otros consejos

No soy un chico de Oracle, pero al parecer hay un comando:

set feedback off

que le impide devolver el recuento de registros afectados. Es esta línea en el procedimiento almacenado? O ha intentado 'set retroalimentación sobre'? Funcionalmente Creo que esto es sólo el reverso de SET de SQL Server / OFF comando NOCOUNT ON.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top