2012-09-19 4 views
0

INSERT jsp를 사용하는 ms 액세스 데이터베이스의 일부 데이터이지만 SQLException이 표시됩니다. 쿼리에 하위 쿼리가 있습니다. 액세스에서 쿼리를 실행하려고했는데 쿼리가 제대로 실행됩니다. jsp가 예외를 던지는 이유를 잘 모르겠습니다. 나는 지금도 3 시간 동안 계속해서 쿼리를 반복적으로 점검했지만 아직 사용하지는 않습니다. 누구든지 도울 수 있습니까 ??jsp를 사용하여 ms 액세스 데이터베이스에 쓰는 방법

* 은 java.sql.SQLException : [Microsoft] [ODBC Access 드라이버]는 구문 오류 쿼리 식 (누락 연산자) '(사용자의 ID를 선택한 다음

try { 
     Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance(); 

     //Creating new statement 
     Connection conn = DriverManager.getConnection("jdbc:odbc:accdbJava"); 

     String uName = ((UserInfo) session.getAttribute("userInfo")).getUserName().trim(); 

     //Creating statement 
     PreparedStatement stmt = conn.prepareStatement("INSERT INTO Message (User_ID, Heading, Body, DatePosted) VALUES ('(SELECT ID FROM User WHERE UserName = '" + uName + "')', '" + messageItem1.getSubject() + "', '" + messageItem1.getMessage() + "', '" + messageItem1.getDatePosted() + "');"); 

     //Executing the update 
     stmt.executeUpdate(); 

     //Closing connection, statement 
     stmt.close(); 
     conn.close(); 
    } 
    catch(Exception e) { 
     e.printStackTrace(); 
    } 

예외는 WHERE UserName = 'hrai') ''. sun.jdbc.odbc.JdbcOdbc.SQLPrepare에서 sun.jdbc.odbc.JdbcOdbc.standardError (알 소스)에 sun.jdbc.odbc.JdbcOdbc.createSQLException (알 소스) (알 소스)에 sun.jdbc에서 PostMessage.doPost (PostMessage.java:55)에서 PostMessage.addMessageToDatabase (PostMessage.java:118) 에서 sun.jdbc.odbc.JdbcOdbcConnection.prepareStatement (알 소스)에 .odbc.JdbcOdbcConnection.prepareStatement (알 소스) org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain)의 javax.servlet.http.HttpServlet.service (HttpServlet.java:637) (javax.servlet.http.HttpServlet.service (HttpServlet.java:717) ) .java : 290) org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve .invoke (StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:102) (StandardEngineValve.java:109) org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:298) at org.apache.coyote.http11.Http11Processor .process (Http11Processor.java:857) at org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandl (알 수없는 출처)에서 * (일)

답변

1

다음 변경을 시도하십시오.

참고 : Access 데이터베이스가 아닌 경우에도 작동합니다. 액세스에 대한 아래의 편집을 참조하십시오.

String SQLQuery = "INSERT INTO Message (User_ID, Heading, Body, DatePosted) " + 
      "VALUES ((SELECT ID FROM USER WHERE username=?), ?, ?, ?)"; 

PreparedStatement stmt = conn.prepareStatement(SQLQuery); 
stmt.setString(1, uName); 
stmt.setString(2, messageItem1.getSubject()); 
stmt.setString(3,messageItem1.getMessage()); 
stmt.setDate(4,messageItem1.getDatePosted()); 

쿼리 끝에는 세미콜론이 필요하지 않습니다. Prepared statement을 올바르게 사용하면 쿼리와 문자열 작성을 단순화 할 수 있습니다.

좋은 메모가 아닌 스크립틀릿 (< %%>) 태그 내부에서 수행 된 것일 수 있습니다. 이 코드를 백엔드 Java 클래스로 옮길 수 있습니다.

편집 - 다음 오류가 표시된 후 Access를 열어 쿼리를 테스트했습니다. 원래 쿼리는 내부 선택에 대한 작은 따옴표가 추가로 포함되어 있다는 문제점을 안고 있습니다.

Values ('(SELECT ID FROM User WHERE UserName = 'foo')'... 

select 주위의 작은 따옴표로 인해 누락 된 연산자 예외가 발생합니다. 그들보다 제거하면 내 쿼리에서 오류가 발생합니다. 두 쿼리가 거의 동일합니다.

이 쿼리는 다른 데이터베이스 (MySQL, SQL Server 등)에서 작동하지만 모든 SQL 규칙을 따르지 않으므로 때로는 약간의 충돌이 발생할 수 있습니다.

은 삽입 내가 인수 일부 주위에 이동

String SQLQuery = "INSERT INTO MESSAGE (User_ID, Heading, Body, DatePosted) " + 
    "SELECT ID, ?, ?, ? " + 
    "FROM USER " + 
    "WHERE username=?"; 

PreparedStatement stmt = conn.prepareStatement(SQLQuery); 

stmt.setString(1, messageItem1.getSubject()); 
stmt.setString(2,messageItem1.getMessage()); 
stmt.setDate(3,messageItem1.getDatePosted()); 
stmt.setString(4, uName); 

메모를 수행하기 위해 내 원래의 대답에 다음 수정을 시도합니다. 그리고 VALUES 키워드는 사용되지 않습니다. 이 쿼리는 Access에서 나를 위해 일한

+0

서블릿 코드입니다. 그리고 그것은 작동하지 않았다 –

+0

코드 구현은 다음과 같은 오류를 준다 : java.sql.SQLException : [Microsoft] [ODBC Microsoft Access Driver] 쿼리 입력은 적어도 하나의 테이블이나 쿼리를 포함해야한다. –

+0

@ nick-s 내 편집을 참조하십시오. 시간을내어 액세스를 열고이를 테스트했습니다. – Sean

0

내가

'(사용자의 ID를 선택 사용자 이름 =' "+ uName의 +" ')'

CSTR (사용자의 ID를 선택을 변경하려고 할 WHERE 사용자 이름 = ' "+ uName +" ')

+0

다음 스택 추적 인쇄 인 : java.sql.SQLException의이 : [마이크로 소프트] [ODBC Microsoft Access에서 드라이버] 쿼리 입력은을 포함해야 적어도 하나의 테이블 또는 쿼리. –

0

내부 쿼리

사용자의

SELECT ID는 어디에서 사용자 이름을 = ' "+ uName의 +"'

, 당신이 사용자 테이블의 여러 레코드를 가지고 있다고 생각 하나 개의 값을 반환해야 UserName hrai는 코드 실행 문제를 만듭니다.

있는지 확인이 쿼리 반환 하나 개의 레코드 만 사용자로부터 고유

는 고유 (ID)를 선택하여 (하나 개의 값 만)

시도의 beloq 쿼리 WHERE 사용자 이름 = ' "+ uName의 +"'

그러나 아직도해야는 하나 개의 값이 쿼리에서 반환

관련 문제