2013-03-31 7 views
0

기본적으로 데이터베이스 테이블을 getSelectRow 값으로 업데이트하려고합니다. 보시다시피 질의는 정확한 데이터를 찾았지만 실제로 데이터베이스에 추가 할 때 큰 문제가 있습니다.
오류는 SQL 구문에 있지만 어디에서 잘못 될지 알 수 없습니다. 도와주세요.INSERT 문장에서 알 수없는 SQL 문제

이 쿼리는 실행되지만 테이블을 업데이트하지 않는 이유는 알 수 없습니다.

INSERT INTO customerdetails 
     FName  = 'Tim' 
    AND SName  = 'Cooley' 
    AND Address  = '52  Buckminster Drive Dorridge Solihull West Mids' 
    AND Postcode  = 'B93 8PG' 

자바 코드 :

private void sendBtnMouseClicked(java.awt.event.MouseEvent evt) {          
    // TODO add your handling code here: 

    int insertRow = newOrderTbl.getSelectedRow(); 
    int col2 = 0; 

    String sql3 = "INSERT INTO customerdetails VALUES " 
      + "FName   = '" + newOrderTbl.getValueAt(insertRow, col2)  +"'" 
      + "AND SName  = '" + newOrderTbl.getValueAt(insertRow, col2+1) +"'" 
      + "AND Address  = '" + newOrderTbl.getValueAt(insertRow, col2+2) +"'" 
      + "AND Postcode  = '" + newOrderTbl.getValueAt(insertRow, col2+3) +"'"; 
    System.out.println(sql3); 
    try{ 

     pst = conn.prepareStatement(sql3); 
     pst.executeUpdate(sql3); 
     JOptionPane.showMessageDialog(null, "Deleted"); 


     CustomerTable(); 

    } 
    catch (Exception e){ 
     JOptionPane.showMessageDialog(null, e); 
    } 


} 
+2

SQL 인젝션 취약점이 있습니다. – SLaks

+0

나는 알고있다. 그러나 이것은 아무데도 출판되지 않을 개인 프로젝트이므로 중요하지 않다. 오류는 제발 도와주세요. –

+0

'pst.executeUpdate (...)'의 반환 값은 무엇입니까? Javadoc에 따르면, "(1) SQL 데이터 조작 언어 (DML) 문에 대한 행 수 또는 (2) 아무것도 반환하지 않는 SQL 문에 대해 0"을 리턴합니다. – mthmulders

답변

3

로 시작하려면, 당신의 SQL 구문이 잘못 (그것은 당신의 데이터베이스 엔진에 대한 표준이 아닌 SQL 구문 적어도 있음). 둘째, 코드가 SQL Injection 공격에 취약합니다.

두 가지 문제를 모두 해결하려면 PreparedStatement을 사용해야합니다 (잘못하고있는 경우). 코드에서 기본 예 :

String sql = "INSERT INTO customerdetails (FName, SName, Address, Postcode) VALUES (?, ?, ?,?)"; 
PreparedStatement pst = conn.prepareStatemtnt(sql); 
pst.setString(1, newOrderTbl.getValueAt(insertRow, col2)); 
pst.setString(2, newOrderTbl.getValueAt(insertRow, col2+1)); 
pst.setString(3, newOrderTbl.getValueAt(insertRow, col2+2)); 
pst.setString(4, newOrderTbl.getValueAt(insertRow, col2+3)); 
pst.executeUpdate(); 
//rest of code... 

는 이전 예제와 유사 매개 변수로 값을 전달한다, 당신의 SQL 구문이 작동합니다 가정 :

String sql3 = "INSERT INTO customerdetails VALUES " 
     + "FName   = ?" 
     + "AND SName  = ?" 
     + "AND Address  = ?" 
     + "AND Postcode  = ?" 
pst = conn.prepareStatement(sql3); 
pst.setString(1, newOrderTbl.getValueAt(insertRow, col2)); 
pst.setString(2, newOrderTbl.getValueAt(insertRow, col2+1)); 
pst.setString(3, newOrderTbl.getValueAt(insertRow, col2+2)); 
pst.setString(4, newOrderTbl.getValueAt(insertRow, col2+3)); 
pst.executeUpdate(); 
//rest of code... 
0

업데이트 문이 될 것입니다 -

String sql3 = "INSERT INTO customerdetails(FName,SName,Address,Postcode) VALUES " 
      + " '" + newOrderTbl.getValueAt(insertRow, col2)  +"'," 
      + " '" + newOrderTbl.getValueAt(insertRow, col2+1) +"'," 
      + " '" + newOrderTbl.getValueAt(insertRow, col2+2) +"'," 
      + " '" + newOrderTbl.getValueAt(insertRow, col2+3) + "')"; 

또한 PreparedStatement를 사용해야합니다.

감사

0

String sql3 = "INSERT INTO customerdetails(FName,SName,Address,Postcode) VALUES (" 
      + "'" + newOrderTbl.getValueAt(insertRow, col2)  +"'" 
      + "'" + newOrderTbl.getValueAt(insertRow, col2+1) +"'" 
      + "'" + newOrderTbl.getValueAt(insertRow, col2+2) +"'" 
      + "'" + newOrderTbl.getValueAt(insertRow, col2+3) +"')"; 

코드에서 생성 된 삽입 문이 유효하지 않은 것으로 변경하십시오. 자세한 내용은 SQL Insert Statement을 참조하십시오.

더 나은 방법은 데이터베이스 작업을 처리하기위한 전용 Serverside DAO 클래스를 만드는 것입니다.

+0

너 다 남자 야! 도와 줘 타이 :) –