2014-01-28 4 views
0

У меня странная проблема. Когда я выполнить запрос в следующем фрагменте кода он бросает MySQLSyntaxErrorException с сообщением: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 
''fantasy' SET Quantity = 3 WHERE BookName = 'The Silmarilion'' at line 1 

Код:

private void updateDBTable(String category, Vector dataVector) { 
    try { 
     for(int i = 0; i < dataVector.size(); i++) { 

      String bookName = String.valueOf(((Vector) dataVector.elementAt(i)) 
            .elementAt(0)); 
      int quantity = (int) ((Vector) dataVector.elementAt(i)) 
            .elementAt(4);    

      statement = databaseConnection 
       .prepareStatement("UPDATE ? SET Quantity = ? WHERE BookName = ?"); 
      statement.setString(1, category); 
      statement.setInt(2, quantity); 
      statement.setString(3, bookName); 
      statement.executeUpdate(); 
     } 
    } 

Но если я пишу это таким образом:

private void updateDBTable(String category, Vector dataVector) { 
    try { 
     for(int i = 0; i < dataVector.size(); i++) { 

      String bookName = String.valueOf(((Vector) dataVector.elementAt(i)) 
             .elementAt(0)); 
      bookName = "'" + bookName + "'"; 
      int quantity = (int) ((Vector) dataVector.elementAt(i)) 
             .elementAt(4);    

      statement = databaseConnection 
       .prepareStatement("UPDATE " + 
            category + 
           " SET Quantity = ? WHERE BookName = " + 
           bookName); 
      statement.setInt(1, quantity); 
      statement.executeUpdate(); 
     } 
    } 

Он отлично работает. Можете ли вы помочь мне понять, почему синтаксис в первом примере неверен?

+1

Вы задаете имя таблицы в качестве параметра, подготовленные операторы будут работать только для значений столбцов. –

ответ

0

В первом случае вы также указали имя таблицы в качестве параметра. Подготовленные утверждения принимают имена столбцов в качестве параметров. Вам нужно указать имя таблицы в инструкции при использовании prepareStatement

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