JDBC prepareStatement не работает - PullRequest
0 голосов
/ 03 июня 2009

Я пытаюсь использовать функцию prepareStatement. Код ниже. После выполнения он возвращает мне набор vlicense строк вместо значений.

Когда код заканчивает statement.setString(), оператор становится:

select 'vlicense' from Vehicle

Однако, это должно быть:

select vlicense from Vehicle

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

statement = oConnection.prepareStatement("select ? from Vehicle");
String tempString = "vlicense";
statement.setString(1, tempString);
resultSet = statement.executeQuery();

Ответы [ 4 ]

4 голосов
/ 03 июня 2009

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

2 голосов
/ 03 июня 2009

Когда вы добавляете переменную связывания в оператор, подобный этому, он экранируется, так что фактическая строка SQL в вашем примере поступит в базу данных как «SELECT» vlicense «FROM Vehicle», выбрав вместо имени столбца буквенную строку ты хочешь.

Вам нужно объединить имя этого столбца переменной в свой оператор SQL, прежде чем его подготовить:

statement = oConnection.prepareStatement("SELECT " + vlicense + " FROM Vehicle");

Переменные связывания действительно предназначены для параметров запроса, а не для динамических запросов.

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

Это не имеет ничего общего с jdbc, prepared-statements или mysql.
Это просто неправильное sql утверждение.

Если вы введете:

Select 'justanexample' from Vehicle

и таблица содержит 4 строки, вы получите 4 раза

'justanexample'
'justanexample'
'justanexample'
'justanexample'

как результат.

Вы не указали структуру таблицы, но я думаю, Заявление должно выглядеть так:

select * from Vehicle where license = ?
0 голосов
/ 03 июня 2009

? не может использоваться для указания полей, просто чтобы сделать несколько фильтров в вашем запросе, например:

statement = conn.prepareStatement("select field from Vehicle where name=?");

В вашем случае ваш запрос построен как:

select 'vlicense' from Vehicle

, что означает: ДАЙТЕ МНЕ СТРОКУ 'vlicense' ДЛЯ КАЖДОГО ЗАПИСИ 'Транспортного средства'. И вы получите n повторных строк в зависимости от количества записей в вашей таблице

...