2017-01-01 2 views
1

я встретил проблему, которую я не могу объяснить, используя Java/SQLite:Sqlite + Java, странное поведение с подготовленное заявление

String sql = "Select date, type FROM line ORDER BY ?"; 
    PreparedStatement st = DB.getConnexion().prepareStatement(sql); 
    st.setString(1, sort); 
    ResultSet rs = st.executeQuery(); 

Этот фрагмент кода дает мне неправильный порядок (порядок по умолчанию) [и поверьте мне, я проверил и перепроверял, что параметр был хорошим]

String sql = "Select date, type FROM line ORDER BY " + sort; 
    PreparedStatement st = DB.getConnexion().prepareStatement(sql); 
    //st.setString(1, sort); 
    ResultSet rs = st.executeQuery(); 

И этот результат дает ожидаемый результат. Я немного в проигрыше здесь, это не имеет никакого смысла для меня. Я попытался перезапустить eeclipse, перестроить проект, проверить свой запрос непосредственно из браузера sqlite, проверить параметр и результаты в любом возможном месте, но похоже, что функция setString() sqlite неправильно атрибуты моего параметра, и это не даже сбой или ошибка.

У меня либо отсутствует что-то действительно глупое, либо здесь что-то не так.

+2

Возможный дубликат [Использование подготовленного оператора и переменной bind Order By в Java с драйвером JDBC] (http://stackoverflow.com/questions/12430208/using-a-prepared-statement-and-variable-bind-order -by-in-java-with-jdbc-driver) – GurV

ответ

3

На самом деле это удивительно, что этот синтаксис принят механизмом SQL. Вероятно, это может случиться и в некоторых других.

В любом случае, sort интерпретируется как строковая константа, поэтому все строки будут иметь одинаковое значение для алгоритма сортировки. Поэтому, поскольку они имеют одинаковое значение, он сохраняет первоначальный порядок.

Вы не можете использовать такой динамический оператор, единственный способ - это второе решение, которое присоединяет сортировку непосредственно к строке оператора.

+0

Я был настолько упрям, что не понимал, что не имею дело с данными, facepalm для меня и благодарю вас за вас. Мне жаль, что он не разбился и назвал меня идиотом. – fen

1

Это потому, что вы говорите SQL, что этот параметр является строкой. Предположим, что параметр Name. Ваше заявление будет что-то вроде этого:

Select date, type FROM line ORDER BY 'Name' 

Это может быть технически действительным SQL, но это не собирается заказать колонки с пользой - это не заказ в колонке Name, это буквально заказ на «Name», который всегда является одной и той же константой.

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

+0

Спасибо вам также – fen

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