2009-04-16 6 views
1

공식 Sybase JDBC 드라이버를 사용하여 데이터베이스에 연결하고 CallableStatement를 만들고 매개 변수를 바인딩 한 다음 .execute()를 호출하여 저장 프로 시저를 호출합니다.Sybase JDBC 드라이버가 예외를 "먹는"이유는 무엇입니까?

그러나 저장 프로 시저가 실패하더라도 예외가 throw되지 않습니다. 필자는 Wireshark를 사용하여 데이터베이스 트래픽을 스니핑하고 오류 메시지가 다시 돌아와서 오류가 다시 발생하는지 확인할 수 있습니다.

  1. 왜 .Execute를()와 .executeUpdate 같습니다

    마지막으로 나는 그러나 나는 아직도 두 가지 질문이 남아 있고, 대신 .Execute를의 .executeUpdate()() 를 사용하여 나에게 예외를주지 않는 것으로 확인 다르게 행동 하는가? 인터페이스의 SUN 문서에서 그들은 거의 같은 일을해야한다고 생각합니다 ...
  2. 저장 프로 시저를 호출 할 때 .execute()를 .executeUpdate()로 바꾸는 것이 항상 적절한가요? .executeUpdate()로 호출 할 수있는 특정 요구 사항을 준수해야합니다. 그것은 모두에서 예외 : SQLException을 던진다 : 같이 (I는 jTDS를 시도했습니다, 그것은 제대로 동작 :

업데이트을 (? 예를 들어, 마지막 단계로/삽입 문을 삭제/업데이 트를해야합니다) case - .execute() 및 .executeUpdate()). 그러나 내 제어 할 수없는 제약으로 인해 드라이버를 전환하는 것은 실제로 불가능합니다.

또한이 스토어드 프로 시저에서 반환 한 결과에 관심이 없습니다. 삽입/업데이트 유형 프로 시저입니다. 나는 그것이 실패했는지 안하는지를보기 위해서 (그리고 붙잡을 수 있을지/기록 할 것인가) 삽입 될 뿐이다. 내가 시도한 다른 것은 .execute() 후에 연결 해제 경고를 얻는 것이지만 아무것도 포함하지 않았다.

+1

다른 드라이버가 동일한 동작을합니까? jTDS는 어떻습니까? http://jtds.sourceforge.net/ –

답변

5

이러한 Sybase 사람들은 미친 짓이기 때문에 예외를 먹는 것입니다! 준비된/호출 가능한 명령문에 executeUpdate()를 사용하지 않아도됩니다. 그것이 작동하도록하기 위해 사용해야하는 것이라면 계속 그렇게하십시오. 하지만 Sybase에 버그 보고서를 제출해야합니다. 드라이버가 그렇게해야 할 이유가 없습니다.

0

는베이스에 대해 아무것도 몰라 하지만

executeUpdate의은 실행보다 더 많은 정보를 정기적으로 반환 : 업데이트/삽입 된 행의 #를/삭제

->이 UPDATE INSERT가 삭제로 사용할 수 있으며, DML 작업에 따라 javadoc에.

executeQuery는 SELECT 문에 대한 ResultSet을 반환합니다.

1

sybase 사람들이 "미친"것인지 확실하지 않습니다. 아마도.

한편, 호출 가능 명령문의 리턴 코드를 활발히 점검하지 않을 때 결과를 동기식으로 검색하지 않으면 성능이 현저해질 수 있습니다. 아직 완전히 테스트하지는 않았지만 문제에 대한 간단한 해결 방법이 있습니다 (ASE 15.5 jconn 7) :

는 (적어도) 저장 프로 시저를 호출 할 때 저장된 프로 시저에서 아웃 PARAM을 가져올 때 예외가 발생됩니다

:

// one may force the error check by retrieving the return code! 
    cs = conn.prepareCall("{ ? = call sp_nested_error @nNestLevels = 1 }"); 
    cs.registerOutParameter(1, Types.INTEGER); 
    cs.execute(); 
    try { 
     cs.getInt(1); 
     fail(); 
    } catch(SQLException e) { 
     assertTrue(e.getMessage().indexOf("some error") > -1); 
    } 

또 다른 호기심이 동작은 최대 표시된다 중첩 저장 프로 시저 호출에서 오류가 트리거 될 때 최상위 프로 시저가 오류를 발생 시키면 해결 방법이 필요하지 않습니다.