2014-07-05 5 views
1

이 예외를 요청하지 :SQL 예외는, 생성 된 키는 내 코드의 한 부분에서 발생되는

Connection con = null; 
    PreparedStatement ps = null; 
    ResultSet rs = null; 

String query = "Insert into ..."; 
try { 
     con = DriverManager.getConnection(...); 
     ps = con.prepareStatement(query, java.sql.Statement.RETURN_GENERATED_KEYS); 
     ps.executeUpdate(query); 
     rs = ps.getGeneratedKeys(); // Exception is here 
    } 

    while (resultset.next()) { 
     id = String.valueOf(resultset.getInt(1)); 
    } 

예외 :

생성 키를 요청하지합니다. 당신은 변수 id에 (즉 auto_increment입니다)

내 목적은 새 레코드를 삽입한다) Statement.executeUpdate() 또는 위하여 Connection.prepareStatement (에 Statement.RETURN_GENERATED_KEYS를를 지정하고 첫 번째 필드 (id)를 저장해야합니다.

+0

@a_horse_with_no_name 나는 업데이트를 참조 @a_horse_with_no_name mysql을 –

+0

를 사용합니다. –

+0

두번째 예제는'prepareStatement()'호출을위한'java.sql.Statement.RETURN_GENERATED_KEYS' 파라미터를 포함하지 않습니다. –

답변

1

ps.execute() 대신 ps.executeUpdate()를 시도하십시오.

3

잘못된 execute 메서드를 사용하고 있습니다. String을 사용하는 대신 매개 변수없이 하나를 사용해야합니다. Chris Joslin이 언급 한 것처럼 INSERT의 경우 executeUpdate을 사용하는 것이 더 좋습니다.

execute(String) 또는 그 형제 중 하나 인 PreparedStatement을 호출 할 때 정확한 JDBC 드라이버가 즉시 SQLException을 던져야하지만 일부 드라이버는이 규칙을 무시합니다.

1

그것은해야하지 :

String query = "Insert into Books(Name,ISBN,Status,Date)" + 
    "values('" + name + "','" + isbn + "','" + status+ "','" + date + "') "; 
try { 
    con = DriverManager.getConnection(...); 
    ps = con.prepareStatement(query,java.sql.Statement.RETURN_GENERATED_KEYS); 
    ps.executeUpdate(); 
    rs = ps.getGeneratedKeys(); // Exception is here 
} 


그것은 당신의 첫 번째 예제처럼 보이는, 당신이 올바르게 준비,하지만 단지 ps.executeUpdate의 다시 대신 쿼리 문자열로 executeUpdate의 전화 할().

ps = con.prepareStatement(query, java.sql.Statement.RETURN_GENERATED_KEYS); 
    ps.executeUpdate(query);