Как мне обрабатывать специальные символы в Java PrepareStatement? - PullRequest
2 голосов
/ 26 мая 2009

В следующем запросе SQL с использованием класса PreparedStatement:

String query_descrip = "insert into timitemdescription (itemkey, languageid, longdesc, shortdesc) values (?, 1033, ?,?)";
PreparedStatement pstmt2 = con.prepareStatement(query_descrip); 
pstmt2.setInt(1, rs4);
pstmt2.setString(2, itemdescription);
pstmt2.setString(3, itemdescription.substring(0,39));
pstmt2.executeUpdate();       

Я иногда получаю апострофы и одинарные и двойные кавычки в своих описаниях предметов. например, моя последняя проблема с одним элементом - это монитор «Планар 22». Конечно, строка была неверно истолкована и считалась, что значение описания было просто «Планар 22». Каков наилучший способ обработки специальных символов в строке?

Я читал, что некоторые люди используют регулярные выражения, однако, похоже, что они специфичны для каждого конкретного случая. Другой способ, над которым я работаю, - это чтение строкового массива символ за символом. Я надеялся, что есть более эффективный и менее ресурсоемкий способ сделать это.

UPDDATE После более тщательного тестирования выясняется, что в моем коде возникли другие проблемы. это была также проблема кодирования URL. Когда html-форма заполняется кодом jsp, он пытается переместить поле описания в онлайн-форму, он усекает его там в форме, а не в запросе. jTDS также исправил проблему получения специальных символов. Поскольку jTDS - это jar, это также помогло избежать перезагрузки компьютера. Я награждаю потоком jTDS награду, так как это было тем, что я частично использовал.

заранее спасибо

Ответы [ 4 ]

15 голосов
/ 26 мая 2009

Поскольку вы используете PreparedStatement, вам вообще ничего не нужно делать, он будет обработан для вас драйвером JDBC. Единственное, на что вы должны обращать внимание - это символы не ASCII, в частности, вы должны убедиться, что таблицы БД используют кодировку для текстовых столбцов, которая может обрабатывать все символы, которые вы собираетесь использовать. Но это проблема SQL, а не проблема Java.

3 голосов
/ 29 мая 2009

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

Попробуйте использовать драйвер jTDS и посмотрите, поможет ли он вам с PreparedStatement. Это драйвер базы данных с открытым исходным кодом для SQL Server. Сейчас я использую его на работе, и он работает как чемпион и фактически соответствует спецификации JDBC в отличие от драйвера MS.

3 голосов
/ 26 мая 2009

Вам не нужно обрабатывать эти символы специально, если вы привязываете их как параметры к PreparedStatement, как вы делаете. Это одно из главных преимуществ подхода с подготовленным заявлением.

0 голосов
/ 01 июня 2009

Я вполне уверен, что проблема не в коде, который вы опубликовали. Чтобы помочь устранить неполадки:

  1. Вы пробовали запустить приведенный выше фрагмент кода в отладчике? Какое значение имеет "itemdescription", прежде чем передать его в вызов базы данных?
  2. Как вы на самом деле проверяете значение в базе данных? Это больше Java-код? Или вы смотрите на это с помощью SQLCMD или что-то в этом роде?
...