ExecuteNonQuery () retorna -1 na atualização quando os registros são atualizados
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;
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.