2009-06-02 2 views
0

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

Когда код завершения 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

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

0

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

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

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

select 'vlicense' from Vehicle 

, что означает: GET ME строковое «vlicense» ДЛЯ КАЖДОГО ЗАПИСИ «Vehicle». И вы получите n повторяющиеся строки в зависимости от количества записей в вашей таблице

2

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

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

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

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

0

Это не имеет никакого отношения к jdbc, prepared-statements или mysql.
Это просто неправильный оператор sql.

Если вы наберете:

Select 'justanexample' from Vehicle 

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

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

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

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

select * from Vehicle where license = ?