更新记录时,ExecuteNonQuery()在Update中返回-1

Bar*_*000 5 c# asp.net oracle11g

我已经验证了我的方法/ Oracle过程是否正常工作,但在我的C#中,我始终从ExecuteNonQuery()返回-1.因此,下面的bool总是假的.我们只在DB(Oracle)中使用触发器来执行INSERT语句.我是否需要触发更新语句?

有什么建议为什么会发生?它肯定更新了一条记录:

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);
    }
Run Code Online (Sandbox Code Playgroud)

对不起......继承人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;
Run Code Online (Sandbox Code Playgroud)

END Change_Password;

Mik*_*att 13

尝试显式返回SQL%ROWCOUNT.

根据MSDN,DbCommand..ExecuteNonQuery将始终为存储过程调用返回-1:

对于UPDATE,INSERT和DELETE语句,返回值是受命令影响的行数.对于所有其他类型的语句,返回值为-1.

如果我在使用大量存储过程的时候记得正确,我相信你需要使用输出参数来返回更新行数等内容.