2012-09-19 91 views
0

我正在嘗試INSERT某些數據在ms訪問數據庫時使用jsp但它顯示了SQLException。 查詢有一個子查詢。 我試圖在訪問中運行查詢,查詢執行得很好。我不確定爲什麼jsp拋出異常。我已經一遍又一遍地檢查了我的查詢3小時,但仍然沒有用。誰能幫忙?如何寫入ms訪問數據庫使用jsp

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(); 
    } 

例外如下:

* java.sql.SQLException中:[微軟] [ODBC Microsoft Access驅動程序]語法錯誤(缺少運算符)查詢表達式 ''(SELECT ID FROM用戶WHERE UserName ='hrai')''。 在sun.jdbc.odbc.JdbcOdbc.createSQLException(未知來源) 在sun.jdbc.odbc.JdbcOdbc.standardError(未知來源) 在sun.jdbc.odbc.JdbcOdbc.SQLPrepare(未知來源) 在sun.jdbc .odbc.JdbcOdbcConnection.prepareStatement(未知來源) 在sun.jdbc.odbc.JdbcOdbcConnection.prepareStatement(未知來源) 在PostMessage.addMessageToDatabase(PostMessage.java:118) 在PostMessage.doPost(PostMessage.java:55) 在javax.servlet.http.HttpServlet.service(HttpServlet.java:637) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain .java:290) 在在org.apache.catalina.core.StandardContextValve org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) .invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at 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 er.process(Http11Protocol.java:588) at org.apache.tomcat.util.net.JIoEndpoint $ Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Unknown Source) *

回答

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可以簡化查詢和構建字符串。

在附註中,這可能是在scriptlet(< %%>)標籤內完成的,這不是一個好的做法。您可能需要將此代碼移至後端Java類。

編輯 - 看到您的下一個錯誤後,我打開Access以測試查詢。您的原始查詢遭受的問題是您的內部選擇周圍有一組額外的單引號。

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

圍繞select的額外單引號組給出缺少的操作符異常。如果你刪除了那些比你從我的查詢中得到的錯誤。 因此這兩個查詢幾乎完全相同。

該查詢可以與另一個數據庫(MySQL,SQL Server等)一起使用,但Access並不遵循所有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

它是一個servlet代碼。並且它不起作用 –

+0

您的代碼實現提供了以下錯誤:java.sql.SQLException:[Microsoft] [ODBC Microsoft Access Driver]查詢輸入必須至少包含一個表或查詢。 –

+0

@ nick-s看到我的編輯。我花時間打開訪問權限並對此進行測試。 – Sean

0

我想嘗試改變

'(SELECT ID FROM用戶其中username =' 「+ UNAME +」 ')'

CSTR(SELECT ID FROM用戶其中username =' 「+ uName +」')

+0

以下是堆棧跟蹤打印:值java.sql.SQLException:[微軟] [ODBC Microsoft Access驅動程序]查詢輸入必須包含至少有一個表或查詢。 –

0

內部查詢

SELECT ID FROM用戶其中username =「‘+ UNAME +’」

,我認爲你必須在用戶表中的多個記錄應該只返回一個值用於UserName hrai,這是創建執行代碼的問題。

確保該查詢返回只有一條記錄(一個值只)

嘗試beloq使用鮮明

SELECT DISTINCT(ID)詢問從用戶其中username = ' 「+ UNAME +」'

但還是應該只有從該查詢返回一個值