2009-05-26 3 views
2

В следующем запросе SQL, используя PreparedStatement класс:Как обрабатывать специальные символы в Java PrepareStatement?

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();  

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

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

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

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

+1

Какой драйвер JDBC и база данных вы используете? – Yishai

+0

Я использую драйвер MS SQL Server 2000 для JDBC и SQL Server 2005 – phill

+0

Почему мой вопрос не используется? – phill

ответ

15

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

+0

, когда я передаю описание товара в подготовленный оператор, строки с двойными кавычками не экранируются и интерпретируются как терминатор значения. Знаете ли вы какие-либо обходные пути для этого? – phill

+0

Какой SQL-сервер и какой драйвер вы используете? Если это действительно не удается избежать строк, это серьезно испорчено (возможно, другими способами), и я бы подумал о переходе к другому. –

+0

Я использую драйвер MS SQL Server 2000 для JDBC и SQL Server 2005 – phill

3

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

3

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

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

+0

Вы могли бы предложить какой-либо пример кода или ссылки, которые реализуют файл jar для подготовленного заявления? – phill

+0

Пример кода, который у вас теперь будет работать. Единственное, что было бы иначе, это URL-адрес драйвера, который вы используете для создания соединения. –

+0

, когда я пытаюсь запустить Class.forName ("net.sourceforge.jtds.jdbc.Driver"); в предложении try..catch, он продолжает говорить мне, что «нужно поймать или выбросить» любые идеи? – phill

0

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

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