Исключения с помощью инструкции prepare на java для обновления mysql

#java #mysql #prepared-statement

#java — язык #mysql #подготовленная инструкция

Вопрос:

У меня есть следующая строка:

 public static final String UPDATESONG = "update songs SET "  
        "name = ?, artist = ?, albumName = ?, genre = ?, "  
        "time = ?, trackNum = ?, year = ?, numlikes = ?, numdislikes = ? where song_id = ?";
  

Затем я использую следующий код для подготовки и использования этой инструкции:

 ps = conn.prepareStatement(AppConstants.Queries.UPDATESONG);
        ps.setString(1, name);
        ps.setString(2, artist);
        ps.setString(3, albumName);
        ps.setString(4, genre);
        ps.setInt(5, time);
        ps.setInt(6, trackNumber);
        ps.setString(7, year);
        ps.setInt(8, numberOfLikes);
        ps.setInt(9, numberOfDislikes);
        ps.setInt(10, id);
        ps.executeUpdate();
  

Когда я запускаю свой тест Junit, я получаю следующую ошибку:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: у вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с ‘time = 240, trackNum = 11, year = ‘2007’, numlikes = 0, numdislikes = 0, где s’ в строке 1

Похоже, что подготовленный оператор добавляет a перед предложением where . Я думаю, что это причина проблемы, но я не уверен, почему она появляется. У кого-нибудь есть какое-либо представление об этой проблеме?

Редактировать: Я исправил проблему с отсутствующей запятой после genre =? и у меня все еще возникает проблема. Однако спасибо, что указали на эту проблему.

Ошибка, которую я получаю после добавления новой запятой, является:

 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'time = 240, trackNum = 11, year = '2007', numlikes = 0, numdislikes = 0, where s' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:407)
at com.mysql.jdbc.Util.getInstance(Util.java:382)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3603)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3535)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1989)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2150)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2119)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2415)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2333)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2318)
at SongDAO.updateSong(SongDAO.java:155)
at SongTest.testUpdateSong(SongTest.java:58)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at junit.framework.TestCase.runTest(TestCase.java:168)
at junit.framework.TestCase.runBare(TestCase.java:134)
at junit.framework.TestResult$1.protect(TestResult.java:110)
at junit.framework.TestResult.runProtected(TestResult.java:128)
at junit.framework.TestResult.run(TestResult.java:113)
at junit.framework.TestCase.run(TestCase.java:124)
at junit.framework.TestSuite.runTest(TestSuite.java:243)
at junit.framework.TestSuite.run(TestSuite.java:238)
at junit.framework.TestSuite.runTest(TestSuite.java:243)
at junit.framework.TestSuite.run(TestSuite.java:238)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
  

Комментарии:

1. Я добавил запятую после genre =? и у меня все еще возникает проблема.

2. Показывает ли это то же сообщение? ... near 'time = 240 ... указал пропущенную запятую.

3. @Thomas Да, сэр, ошибка осталась прежней после того, как я добавил запятую.

4. Это то же самое исключение или то же самое сообщение? Пожалуйста, опубликуйте это еще раз и перед этим проверьте, действительно ли вы перекомпилировали код (у меня были проблемы с тем, что код не перекомпилировался, хотя я думал, что это происходит слишком часто).

5. @Thomas Я перекомпилировал код и обновил свой вопрос. Я включил полную трассировку, но я не уверен, что она может рассказать нам больше. Спасибо за постоянную помощь.

Ответ №1:

"name = ?, artist = ?, albumName = ?, genre = ? " отсутствует последняя запятая.

Ваш SQL будет выглядеть ... , albumName = ?, genre = ? time = ?, trackNum = ?, ...

Комментарии:

1. Спасибо! На самом деле я тоже только что заметил это, но у меня все еще есть проблема.

Ответ №2:

Вы забыли запятую после genre = ? и перед time = ?

Ответ №3:

Вы пропускаете запятую после указания жанра.

   public static final String UPDATESONG = "update songs SET "  
    "name = ?, artist = ?, albumName = ?, genre = ?, "  
    "time = ?, trackNum = ?, year = ?, numlikes = ?, numdislikes = ? where song_id = ?";