Pergunta

Eu estou tentando usar declarações preparadas para definir um nome de tabela para selecionar os dados, mas eu continuo recebendo um erro quando eu executar a consulta.

O erro e código de exemplo é exibido abaixo.

[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();

Quaisquer pensamentos sobre o que poderia estar causando isso?

Foi útil?

Solução

Um nome de tabela não pode ser usado como um parâmetro. Ele deve ser codificado. Assim, você pode fazer algo como:

private String query1 = "SELECT plantID, edrman, plant, vaxnode FROM [" + reportDate + "?]";

Outras dicas

Este é tecnicamente possível com uma solução alternativa, mas muito má prática.

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

E então, quando você quer selecionar a partir first_table você definir o parâmetro com

ps.setInt(1, 99);

Ou se não, você configurá-lo para outra coisa.

Como um número de pessoas disseram, você não pode usar um parâmetro de instrução para um nome de tabela, apenas para variáveis ??como parte da condição.

Com base no fato de que você tem um nome de tabela variável com (pelo menos) dois nomes de tabela, talvez seria melhor para criar um método que leva a entidade que você está armazenando e retorna uma declaração preparada.

PreparedStatement p = createStatement(table);

Isto pode ajudar:

public ResultSet getSomething(String tableName) {

PreparedStatement ps = conn.prepareStatement("select * from \`"+tableName+"\`");
ResultSet rs = ps.executeQuery();
}

Eu não tenho certeza que você pode usar um PreparedStatement para especificar o nome da tabela, apenas o valor de alguns campos. De qualquer forma, você pode experimentar a mesma consulta, mas, sem os colchetes:

"SELECT plantID, edrman, plant, vaxnode FROM ?"
String table="pass"; 

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

PreparedStatement ps=con.prepareStatement(st);

ResultSet rs = ps.executeQuery();

Há uma maneira de passar o nome da tabela como uma variável

Cordas NameOfTable = "test.Employee";

Cordas Fquery = "SELECT * FROM "+ NameOfTable +" onde = Done 'Não'";

Nota: deve haver um espaço entre FROM e do sucesso "e também entre" e onde palavra-chave

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top