Erro no PreparedStatement

5 respostas
D

Galera…tô fazendo uma função que gera a chave automaticamente…o codigo é esse:

public static int getChave(String Campo,String Tabela){

//alguns comandos



try{

st = Conexao.getConexao().prepareStatement(

Select max(?) from ?);
st.setString(1,Campo);
      st.setString(2,Tabela);
}
..............
.............

}//Fim função

Estou passando o nome do Campo e da Tabela corretamente !!!
Só que ta dando uma exceção SQLException…o getMessage() diz o seguinte:
Syntax error or access violation, message from server: “You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near ‘‘FUNCIONARIO’’ at line 1”

Quando eu substituo a String SQL por isso:

st = Conexao.getConexao().prepareStatement(
“Select max(”+Campo+")from " + Tabela) ;

Não dá nenhum problema…alguém sabe o pq ?

5 Respostas

B

Ola,

Simples, quando vc seta o nome da tabela via preparedStatement ele inclui as aspas simples, entao da erro de sql.

Tente setar o nome da tabela na query, assim:

String sql = "select max("+campo+") from "+tabela; ...

D

vlw Bruno pela explicação…entendi o pq do erro !!!..mas a String sql foi exatamente a que coloquei no forum !! flwz…

J

E porque você está gerando essa chave desse jeito? Não seria mais facil coloca-la como auto-increment e se precisar obter a chave depois de inserir usar o getGeneratedKeys()?

M

Olá daniloah,

Concordo com o jairelton. Seria mais interessante deixar o autoincremento pelo BD e já que vc está usando PreparedStatement recuperar a chave com getGeneratedKeys. Vou postar um exemplo de uso para recuperar a última chave inserida:

String atualiza  = "INSERT INTO tabela (campo1, campo2, campo3) VALUES (?, ?, ?)";

PreparedStatement declaracao = conexao.prepareStatement(atualiza, Statement.RETURN_GENERATED_KEYS);
declaracao.setInt(1, campo1);
declaracao.setString(2, campo2);
declaracao.setString(3, campo3);
declaracao.executeUpdate();

ResultSet resultado = declaracao.getGeneratedKeys();
resultado.next();
int chave = resultado.getInt("campo1");

Sobre o seu código para gerar a chave. Sugiro q imprima sua sql e poste aqui para podermos analisar…

Abraços,
Mari

D

É que meu professor de curso Java resolveu não utilizar o auto-incremento do Banco !!! o motivo ? me esqueci !!! mas vou perguntar e depois posto aki !!!

Minha função GeraChave é essa :

public static int getChave(String Campo,String Tabela){

PreparedStatement st  = null;

int primaryKey = 100;  //começa com 100

try{

st = Conexao.getConexao().prepareStatement(

Select max(+Campo+")from " + Tabela) ;
ResultSet resultset = st.executeQuery();
	     
if(resultset.next())
    primaryKey = resultset.getInt(1) + 1;
    }
    catch(SQLException e){
         //System.out.println(e.getMessage());
        JOptionPane.showMessageDialog(..............);
        System.exit(0);
     }
    finally{
try{
    if(st != null)
    st.close();
            }
             catch(SQLException e){
                 JOptionPane.showMessageDialog(..............);
                 System.exit(0);
             }   
     }
   
     return primaryKey;

}

O q vcs acharam ?

Outra pergunta !!! Nos meus métodos de Classe :Ex: Salvar(),Atualizar(),Deletar()…eu sempre declaro uma variavel local de PreparedStatement pra cada método, como vcs podem ver na função GeraChave, e no bloco finally eu fecho ela com o método close()…Só que eu não sou obrigado a fechar o PreparedStatement , né !!! Como vcs fazem quando usam um preparedStatement ? Vcs fazem como eu faço ? Ou declara um PreparedStatement que vale pra classe toda ?

Criado 24 de abril de 2007
Ultima resposta 26 de abr. de 2007
Respostas 5
Participantes 4