2013-09-28 3 views
1

Я пытаюсь обновить свою базу данных, но я получаю ошибку синтаксиса в моем коде .. Пожалуйста, помогите .. Я стараюсь, чтобы изменить его «st.execute (заявление);" и "st.executeUpdate (statement)"; но ошибка все еще существует. Вот мой код ...доступ к Java JDBC мс «Синтаксическая ошибка в UPDATE заявлении»

public void editBook(String inputTitle, String[] newBookInfo) 
{ 
    boolean result = false; 
    try 
    { 
     Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
     con = DriverManager.getConnection("jdbc:odbc:database"); 
     st = con.createStatement(); 
     rs = st.executeQuery("select * from library"); 

     while(rs.next()) 
     { 
      if(boyerMoore(rs.getString("Title").toLowerCase(), inputTitle.toLowerCase())) 
      { 
       isbn = rs.getString("ISBN"); 
       statement = String.format("UPDATE library SET ISBN = '%s', Title = '%s', Author = '%s', Publisher = '%s', Published Year = '%s', Available Copies = '%s', Total Copies = '%s', WHERE ISBN = '%s'", newBookInfo[0], newBookInfo[1], newBookInfo[2], newBookInfo[3], newBookInfo[4], newBookInfo[5], newBookInfo[6], isbn); 
       st.executeQuery(statement); 
       rs.close(); 
       st.close(); 
       con.close(); 

       JOptionPane.showMessageDialog(null, "Edit Succes", "Succes", JOptionPane.PLAIN_MESSAGE); 
       result = true; 
      } 
     } 

     if(!result) 
      JOptionPane.showMessageDialog(null, "\"" + inputTitle + "\" not Found in the Library", "Error", JOptionPane.ERROR_MESSAGE); 
    } 
    catch(Exception ex) 
    { 
     ex.printStackTrace(); 
    } 
} 

Вот полный StackTrace ..

java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Syntax error in UPDATE statement. 
at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source) 
at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source) 
at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(Unknown Source) 
at sun.jdbc.odbc.JdbcOdbcStatement.execute(Unknown Source) 
at sun.jdbc.odbc.JdbcOdbcStatement.executeQuery(Unknown Source) 
at dataBase.editBook(dataBase.java:161) 
at mainFrame.actionPerformed(mainFrame.java:177) 
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
at java.awt.Component.processMouseEvent(Unknown Source) 
at javax.swing.JComponent.processMouseEvent(Unknown Source) 
at java.awt.Component.processEvent(Unknown Source) 
at java.awt.Container.processEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Window.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
at java.awt.EventQueue.access$200(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 
+0

Сделать использование PreparedStatement над строкой # форматом – MadProgrammer

ответ

1

кронштейнами имена полей, которые содержат пробелы: [Published Year]; [Available Copies]; [Total Copies]. Продолжайте ли вы строить инструкцию UPDATE, как вы были, или переключитесь на запрос параметра, вы все равно должны скопировать эти имена.

И как уже было сказано, отбросить запятую перед WHERE ...

[Total Copies] = '%s', WHERE ISBN 
        ^

Если вы получаете сообщение об ошибке «несоответствия типов» после внесения этих изменений, проверьте типы данных полей назначения. В настоящее время ваш оператор предоставляет текстовые значения для этих полей. Если какой-либо из них является числовым вместо текста, исключите одиночные кавычки, связанные с значениями обновления.

+0

Я получаю некоторые ошибки ... «java.sql.SQLException: Нет ResultSet выпускались» –

1

Remove '' перед тем, где

, WHERE 

UPDATE библиотека SET ISBN = «% s ', Title ='% s ', Author ='% s ', Publisher ='% s ', Publisher Year ='% s ', Доступные копии ='% s ', Total Copies ='% s 'WHERE ISBN =' % s '", newBookInfo [0], newBookInfo [1], newB ookInfo [2], newBookInfo [3], newBookInfo [4], newBookInfo [5], newBookInfo [6], ISBN

0

удалить запятой, прежде чем where п. Также попробуйте использовать PreparedStatement вместо использования Statement Используйте этот способ для PreparedStatement

public void editBook(String inputTitle, String[] newBookInfo) 
{ 
    boolean result = false; 
    try 
    { 
     Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
     con = DriverManager.getConnection("jdbc:odbc:database"); 
PreparedStatement pt=con.prepareStatement("select * from library") 
     //st = con.createStatement(); 
     //rs = st.executeQuery("select * from library"); 

rs=pt.executeQuery(); 
     while(rs.next()) 
     { 

//your codes 
     } 


    } 
    catch(Exception ex) 
    { 
     ex.printStackTrace(); 
    } 
1

Несколько вещей смешались.

 Connection con = DriverManager.getConnection("jdbc:odbc:database"); 
     Statement st = con.createStatement(); 
     ResultSet rs = st.executeQuery("SELECT Title, ISBN FROM library"); 
     PreparedStatement statement = con 
       .prepareStatement("UPDATE library " 
         + "SET ISBN = ?, " 
         + "Title = ?, " 
         + "Author = ?, " 
         + "Publisher = ?, " 
         + "[Published Year] = ?, " 
         + "[Available Copies] = ?, " // [...] needed. 
         + "[Total Copies] = ? " // No comma. 
         + "WHERE ISBN = ?"); 

     while (rs.next()) { 
      if (boyerMoore(rs.getString("Title").toLowerCase(), 
        inputTitle.toLowerCase())) { 
       isbn = rs.getString("ISBN"); 
       statement.setString(1, newBookInfo[0]); 
       statement.setString(2, newBookInfo[1]); 
       statement.setString(3, newBookInfo[2]); 
       statement.setString(4, newBookInfo[3]); 
       statement.setString(5, newBookInfo[4]); 
       statement.setString(6, newBookInfo[5]); 
       statement.setString(7, newBookInfo[6]); 
       // statement.setInt(7, Integer.parseInt(newBookInfo[6])); 
       statement.setString(8, isbn); 
       statement.executeUpdate(); 

       JOptionPane.showMessageDialog(null, "Edit Succes", 
         "Succes", JOptionPane.PLAIN_MESSAGE); 
       result = true; 
      } 
     } 
     rs.close(); // Here. 
     st.close(); 
     statement.close(); 
     con.close(); 
+0

Я получаю ошибку .. java.sql.SQLException: [Microsoft] [ODBC Microsoft Access Driver] COUNT поле неправильно \t на sun.jdbc.odbc.JdbcOdbc.createSQLException (Unknown Source) \t на sun.jdbc.odbc.JdbcOdbc.standardError (Unknown Source) \t в sun.jdbc .odbc.JdbcOdbc.SQLExecute (Неизвестный источник) \t at sun.jdbc.odbc.JdbcOdbcPreparedStatement.execute (Неизвестный источник) \t at sun.jdbc. odbc.JdbcOdbcPreparedStatement.executeUpdate (Unknown Source) \t на dataBase.editBook (dataBase.java:203) \t в mainFrame.actionPerformed (mainFrame.java:177) –

+0

мне трудно сказать. Вы получили 'statement.setString (8, isbn)'? Я забыл об этом в первом редактировании. Сначала можно попытаться прокомментировать все строки 'statement'. –

+0

У меня нет интенсивного опыта работы с Access, но для некоторых СУБД, запрашивающих таблицу, а затем обновление одной и той же таблицы невозможно. В этом случае вы можете в цикле запросов собирать записи ID и во второй записи обновления цикла. –

0

Используйте два разных объекта Statement один для чтения другого для обновления. Или закройте существующий оператор и снова заново создайте экземпляр.

Смежные вопросы