2010-02-04 3 views
5

내 메소드/Oracle 프로 시저가 올바르게 작동하지만 C#에서 항상 ExecuteNonQuery()에서 -1이 반환됨을 확인했습니다. 따라서 아래의 bool은 항상 false입니다. DB (Oracle)에서 INSERT 문에 대해서만 트리거를 사용합니다. 업데이트 진술을위한 트리거가 필요한가요?ExecuteNonQuery()는 레코드가 업데이트 될 때 Update에서 -1을 반환합니다.

그 이유는 무엇입니까? 그 확실히 업데이트 한 레코드 :

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

죄송합니다 ...을 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; 

END Change_Password;

+0

저장된 proc은 어떤 모습입니까? – MikeWyatt

답변

13

SQL % ROWCOUNT을 명시 적으로 반환하십시오.

은 MSDN에 따르면, DbCommand..ExecuteNonQuery 항상 저장 프로 시저 호출에 -1 반환합니다 UPDATE를 들어

, INSERT, DELETE 문, 반환 값은 명령에 의해 영향을받는 행의 수 . 다른 모든 유형의 명령문의 경우, 리턴 값은 -1입니다.

내가 저장 발동을 많이 사용하여 내 일에서 정확히 기억 경우

, 난 당신이 갱신 된 행의 수와 같은 물건을 반환하는 출력 인수를 사용해야합니다 생각합니다.

+0

그러나 ExecuteNonQuery 메서드가 추가 출력 매개 변수가 아닌 값을 반환하지 않아야합니까? 그것이 MSDN에서와 같은 것입니다. – Barryman9000

+0

@ Barryman9000 - 그걸 읽는 방법이 아니고 SqlCommand에서 작동하는 방식이 아닙니다. UPDATE/INSERT/DELETE 명령을 내 보내지 않고 저장 프로 시저에 대한 호출을 실행하고 있습니다. 따라서 반환 값 ExecuteNonQuery에서 -1이 될 것입니다. 그것 이외의 값을 원하면 출력 매개 변수로 리턴해야합니다. (OracleCommand는 Create/DropTable 요청에 대해 0을 반환 할 수도 있습니다. http://msdn.microsoft.com/en-us/library/system.data.oracleclient.oraclecommand.executenonquery.aspx) –

+0

Ah-ha .. . 나는 내 테이블을 업데이트 할 때부터 명령을 발행하고 업데이트하고 있다고 생각했습니다. 그래도 당신의 설명은 의미가 있습니다. – Barryman9000

1

나는 오라클 사람이 아니지만, 분명히 명령있다 : 영향을받는 레코드 수를 반환 할 수없는

set feedback off 

은. 이 줄이 저장 프로 시저에 있습니까? 아니면 '피드백 설정'을 시도해 보셨습니까? 기능적으로 나는 이것이 SQL Server의 SET NOCOUNT ON/OFF 명령의 역순이라고 생각합니다.

관련 문제