ExecuteNonQuery () retourne -1 mise à jour lorsque les enregistrements sont mis à jour

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

  •  18-09-2019
  •  | 
  •  

Question

Je l'ai vérifié que ma méthode / procédure Oracle fonctionne correctement, mais dans mon C # je suis retourné -1 toujours de ExecuteNonQuery (). Par conséquent, le ci-dessous bool est toujours faux. Nous utilisons uniquement Déclencheurs dans notre base de données (Oracle) pour les instructions INSERT. Ai-je besoin d'un déclencheur pour une déclaration de mise à jour?

Toutes les suggestions pourquoi cela se passerait-il? Sa mise à jour sans aucun doute un enregistrement:

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);
    }

Désolé ... Heres 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;

Était-ce utile?

La solution

Essayez de revenir explicitement ROWCOUNT SQL%.

Selon MSDN, DbCommand..ExecuteNonQuery retourne toujours -1 pour les appels procédure stockée:

  

Pour les instructions UPDATE, INSERT et DELETE, la valeur de retour est le nombre de lignes affectées par la commande. Pour tous les autres types de déclarations, la valeur de retour est -1.

Si je me souviens bien de mes jours en utilisant beaucoup de procs stockés, je crois que vous devez utiliser un argument de sortie pour retourner des choses comme le nombre de lignes mises à jour.

Autres conseils

Je ne suis pas un gars Oracle, mais apparemment il y a une commande:

set feedback off

qui l'empêche de retourner le nombre d'enregistrements affectés. Est-ce la ligne dans la procédure stockée? Ou vous avez essayé de « mettre des commentaires sur »? Fonctionnellement Je pense que c'est exactement l'inverse de SET NOCOUNT commande ON / OFF de SQL Server.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top