2016-05-07 4 views
0

Я только что узнал о подготовленных операциях, и теперь я пытаюсь включить их в свою программу java. Однако я получаю исключение, когда пытаюсь добавить значения в оператор (таблица и имя). Когда я готовлю только одну переменную, она работает нормально. Что я делаю неправильно?Выберите с помощью подготовленных операторов Java

[SQLITE_ERROR] ошибка SQL или отсутствуют базы данных (около "?": Ошибка синтаксиса)

String sql="SELECT * FROM ? WHERE name = ?"; 
    try { 
     PreparedStatement preparedStatement = connection.prepareStatement(sql); 
     preparedStatement.setString(1, table); 
     preparedStatement.setString(2, name); 
     ResultSet checkTable = preparedStatement.executeQuery(); 
+0

Почему не 'String sql =" SELECT * FROM table WHERE name =? ";'? – SMA

+0

, потому что таблица является переменной, могут быть две разные таблицы – Wideem

ответ

3

Это не так, как подготовленные заявления работают. Как ни странно, вы can't use placeholders for table names. Решение состоит в том, чтобы использовать что-то вроде:

String sql = String.format("SELECT * FROM %s WHERE name = ?", table); 

... и продолжить остаток кода.

+0

Не странно, что вы не можете, параметры для передачи значений, имя таблицы не является значением. –

0

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

Это будет работать, хотя:

String sql="SELECT * FROM any_table_name WHERE name = ?"; 
try { 
    PreparedStatement preparedStatement = connection.prepareStatement(sql); 
    preparedStatement.setString(1, name); 
    ResultSet checkTable = preparedStatement.executeQuery(); 
} catch (Exception e) {} 
+0

Спасибо, что я должен использовать, если мне нужно передать имя таблицы в качестве аргумента, чем? – Wideem

0

Подготовленные заявления для значений столбцов не таблица имен. Вы должны сделать это следующим образом.

String sql = "SELECT * FROM `" + table + "` WHERE name = ?"; 
Смежные вопросы