views:

439

answers:

2

I've verified that my method/Oracle procedure is working correctly, but in my C# I always get -1 returned from ExecuteNonQuery(). Consequently, the below bool is always false. We only use Triggers in our DB (Oracle) for INSERT statements. Do I need a trigger for an update statement?

Any suggestions why that would happen? Its definitely updating one record:

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

Sorry... heres the 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;

END Change_Password;

+1  A: 

I'm not an Oracle guy, but apparently there's a command:

set feedback off

which prevents it from returning the count of records affected. Is this line in the stored procedure? Or have you tried 'set feedback on'? Functionally I think this is just the reverse of SQL Server's SET NOCOUNT ON/OFF command.

Steve Wortham
+3  A: 

Try explicitly returning SQL%ROWCOUNT.

According to MSDN, DbCommand..ExecuteNonQuery will always return -1 for stored procedure calls:

For UPDATE, INSERT, and DELETE statements, the return value is the number of rows affected by the command. For all other types of statements, the return value is -1.

If I remember correctly from my days of using lots of stored procs, I believe you would need to use an output argument to return stuff like the number of updated rows.

MikeWyatt
But shouldn't the ExecuteNonQuery method return the value, rather than an additional output parameter? That's what it sounds like on MSDN.
Barryman9000
@Barryman9000 - that's not how I read it, and it's not how it works on the SqlCommand either - you're not issuing an UPDATE/INSERT/DELETE command, you're issuing a call to a stored proc - therefore the return value from ExecuteNonQuery is going to be -1. If you want a value other than that, you'll need to return it in a output parameter. (Note that the OracleCommand can also return 0 for a Create/DropTable request: http://msdn.microsoft.com/en-us/library/system.data.oracleclient.oraclecommand.executenonquery.aspx)
Zhaph - Ben Duguid
Ah-ha... I was thinking that since I was updating my table, I was issuing and UPDATE command. Your explaination makes sense though, thanks.
Barryman9000