2015-04-08 6 views
0

У меня есть следующий код:ExecuteUpdate с возможными одинарными кавычками

sql = update [myTable] set content = '" map.getString() + "' where id = " map.getKey(); 
stmt.executeUpdate(sql); 

Это работает в цикле, и map.getString() может возвращать строку с одинарными или двойными кавычками в них. Я пытался избежать этого с несколькими кавычками map.getString() (например

sql = update [myTable] set content = ''" map.getString() + "'' where id = " map.getKey(); 

Но не повезло.

Как я могу получить его, чтобы обновить столбец контента с буквальным значением карте .getString()

Пример ошибки я получаю это: (есть много подобных из них)

java.sql.SQLException: Incorrect syntax near 's'. 

или

java.sql.SQLException: Invalid SQL statement or JDBC escape, terminating ''' not found. 
+0

Это не компилируется в Java. Скопируйте в свой * реальный * код. – RealSkeptic

+0

Вам не нужна двойная цитата сразу после sql = ?? –

ответ

0

Использование подготовленного состояния. См. http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html. Они прекомпилированы и, следовательно, более пригодны для выполнения в циклах, а также для обработки содержимого, содержащего символы, которые в противном случае требуют специальной обработки.

2

Избегайте использование конкатенации строк значений параметров для построения вашего запроса:

  • это не безопасно (возможно инъекция SQL)
  • он не оптимизирован (как дб двигатель будет всегда разобрать запрос даже если всегда та же строка отправляется в БД)
  • будет генерироваться много плохих ошибок преобразования (специальный символ и т.д.)

PreparedStatement предпочитают использовать с параметрами связывания.

Пример:

PreparedStatement stmt = connection.prepareStatement("UPDATE mytable SET content = ? WHERE id = ?"); 
stmt.setString(1, map.getString()); 
stmt.setInt(2,map.getKey()); 
stmt.executeUpdate(); 

Использование параметров связывания позволит избежать ошибок преобразования и синтаксической ошибки вы столкнулись с

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