executenonQuery ()는 레코드가 업데이트 될 때 업데이트에서 -1을 반환합니다.

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

  •  18-09-2019
  •  | 
  •  

문제

내 방법/Oracle 절차가 올바르게 작동하는지 확인했지만 C#에서는 항상 ExecuteNupery ()에서 -1을 반환합니다. 결과적으로 아래 부울은 항상 거짓입니다. 우리는 삽입 문을 위해 DB (Oracle)에서 트리거를 사용합니다. 업데이트 문에 대한 트리거가 필요합니까?

왜 그런 일이 일어날 지 제안합니까? 확실히 하나의 레코드를 업데이트합니다.

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

죄송합니다 ... 여기에서 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;

도움이 되었습니까?

해결책

명시 적으로 SQL%RowCount를 반환하십시오.

MSDN에 따르면 DBCommand .. ExecutenOnquery는 항상 저장된 절차 호출에 대해 -1을 반환합니다.

업데이트, 삽입 및 삭제 명령문의 경우 리턴 값은 명령의 영향을받는 행의 수입니다. 다른 모든 유형의 진술의 경우 반환 값은 -1입니다.

저장된 Procs를 많이 사용하는 날부터 정확하게 기억한다면, 업데이트 된 행의 수와 같은 물건을 반환하기 위해 출력 인수를 사용해야한다고 생각합니다.

다른 팁

나는 Oracle Guy가 아니지만 분명히 명령이 있습니다.

set feedback off

영향을받는 기록 수를 반환하지 못하게합니다. 이 선이 저장된 절차에 있습니까? 아니면 '피드백 설정'을 시도 했습니까? 기능적으로 나는 이것이 SQL Server의 SET NOCOUNT ON/OFF 명령의 반대라고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top