2016-05-07 7 views
0

準備されたステートメントについて知りましたが、今ではそれらを自分のJavaプログラムに組み込もうとしています。しかし、文(テーブルと名前)に値を追加しようとすると例外が発生します。私が1つの変数だけで準備すると、うまく動作します。 私は何が間違っていますか?プリペアドステートメントで選択する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

テーブルが変数であるため、2つの異なるテーブルがある可能性があります – 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 = ?"; 
関連する問題