2013-03-04 6 views
0

Java PreparedStatements를 사용할 때 SQL 구문 오류에 몇 가지 문제가 있습니다. Java PreparedStatement 구문 문제

내가 준비하기 위해 노력하고있어 세 개의 문

은 다음과 같습니다

첫 번째 문에서
insertBook = con.prepareStatement("INSERT INTO Books ? VALUES ?"); 
selectBooks = con.prepareStatement("SELECT * FROM Books?"); 
deleteBooks = con.prepareStatement("DELETE FROM Books?"); 

, 나는 두 개의 문자열에 삽입 할 열 목록을 포함하는 하나를 통과하고 싶습니다, 그리고 다른 하나는 삽입 할 모든 값을 포함합니다. 다른 두 문장에서는 끝에 (선택적) WHERE 절을 삽입하고 싶습니다.

나는 이미 비슷한 문제를 다루는 것으로 보이는 this 질문을 보았습니다. 그러나 그의 경우에는 그 단어가 의미가없는 곳에 사용하려고 시도한 것으로 보입니다. SQL에서 실패하지 않는 한, 여기에 문자열을 삽입 할 수 없어야하는 이유가 없습니다. 나는 Javadocs를 샅샅이 살펴 보았지만 그곳에 설명을 해줄 수는 없었다.

감사합니다.

+2

그런 식으로'prepareStatement()'를 사용할 수 없습니다. 문자열을 연결 한 다음 그 결과를 메서드에 전달하지 않는 이유는 무엇입니까? –

답변

1

그것이 어떻게 설계되었는지입니다. ? -s 매개 변수 만 남았습니다. StringBuilder을 사용하여 'WHERE'절을 연결하는 것이 좋습니다.

이 유 여기 StringBuilder를 사용할 수 없습니다 단순한 경우, 그것은 복잡한 쿼리 여기

구축을위한 효과적인 것은 첫 번째 문에 대한 예를

String whereClause = " WHERE Id = ?"; 

String insert = "INSERT INTO [Table](C1, C2) VALUES(?, ?)"; 
String select = "SELECT * FROM [Table] "; 
String update = "UPDATE [Table] SET C1 = ? "; 
String delete = "DELETE FROM [Table] "; 

PreparedStatement insertSt = con.prepareStatement(insert); 
PreparedStatement selectSt = con.prepareStatement(select + whereClause); 
PreparedStatement deleteSt = con.prepareStatement(update + whereClause); 
PreparedStatement updateSt = con.prepareStatement(delete + whereClause); 
+0

'StringBuilder'는 매우 유망 해 보입니다. 이 상황에서'PreparedStatement'를 사용할 방법이 없습니까? JavaDB에 비교적 익숙하지 않습니다. –

+0

@lan Knight StringBuilder는 문자열의 연결에만 사용되며 여전히 PreparedStatement를 사용하여 쿼리를 실행해야합니다. –

0

입니다 :

insertBook = con.prepareStatement("INSERT INTO Books ? VALUES ?"); 

VALUES 다음에 두 번째로 시작하겠습니다. ?. ? 하나만 있기 때문에 하나의 자리 표시 자만 있으므로 문에 하나의 값만 전달할 수 있습니다. 그 부분만으로도 JDBC로 목표를 달성 할 수 없습니다. 실제로, prepareStatement()는 적어도 일부 드라이버와 데이터베이스에 대해 명령문을 데이터베이스 서버로 전송하여 명령문을 준비하도록 지시합니다. 서버는 그 당시 문장을 구문 분석하고 계획하므로 열과 매개 변수의 수를 알려야합니다.

0

"?" JDBC에서 기본 DBMS 프로토콜이 지원하는 매개 변수 대체와 밀접한 관계가 있습니다. 그러나 매개 변수를 바꾸지 않고 DB로 보내지는 실제 SQL을 변경하려고합니다.