Использование подготовленных операторов для задания имени таблицы - PullRequest
26 голосов
/ 30 июля 2009

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

Ошибка и пример кода отображаются ниже.

[Microsoft][ODBC Microsoft Access Driver] Parameter 'Pa_RaM000' specified where a table name is required.



private String query1 = "SELECT plantID, edrman, plant, vaxnode FROM [?]"; //?=date
public Execute(String reportDate){
    try {

        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        Connection conn = DriverManager.getConnection(Display.DB_MERC);
        PreparedStatement st = conn.prepareStatement(query1);
        st.setString(1, reportDate);
        ResultSet rs = st.executeQuery();

Есть мысли о том, что может быть причиной этого?

Ответы [ 7 ]

31 голосов
/ 30 июля 2009

Имя таблицы не может использоваться в качестве параметра. Это должно быть жестко закодировано. Таким образом, вы можете сделать что-то вроде:

private String query1 = "SELECT plantID, edrman, plant, vaxnode FROM [" + reportDate + "?]";
1 голос
/ 22 июля 2017

Это технически возможно с обходным путем, но очень плохой практикой.

String sql = "IF ? = 99\n";
sql += "SELECT * FROM first_table\n";
sql += "ELSE\n";
sql += "SELECT * FROM second_table";
PreparedStatement ps = con.prepareStatement(sql);

И затем, когда вы хотите выбрать из first_table, вы устанавливаете параметр с помощью

ps.setInt(1, 99);

Или, если нет, вы устанавливаете его на что-то другое.

0 голосов
/ 17 июня 2019

Это может помочь:

public ResultSet getSomething(String tableName) {

PreparedStatement ps = conn.prepareStatement("select * from \`"+tableName+"\`");
ResultSet rs = ps.executeQuery();
}
0 голосов
/ 09 мая 2016

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

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

PreparedStatement p = createStatement(table);
0 голосов
/ 04 сентября 2015

Есть способ передать имя таблицы как переменную

String NameOfTable = "test.Employee";

String Fquery = "SELECT * FROM" + NameOfTable + "где Done = 'No'";

Примечание: должен быть пробел между FROM и последующим «а также между» и где ключевое слово

0 голосов
/ 31 января 2014
String table="pass"; 

String st="select * from " + table + " ";

PreparedStatement ps=con.prepareStatement(st);

ResultSet rs = ps.executeQuery();
0 голосов
/ 30 июля 2009

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

"SELECT plantID, edrman, plant, vaxnode FROM ?"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...