PreparedStatement dá erro e Statement não, por quê?

14 respostas
S

try { DriverManager.registerDriver(new com.mysql.jdbc.Driver()); String banco = "testetcc"; //Nome do Banco criado String host = "localhost"; //Maquina onde está o banco String str_conn = "jdbc:mysql://" + host + ":3306/" + banco; //URL de conexão String usuario = "root"; //Usuário do banco String senha = ""; //Senha de conexão Statement stmt = null; //Inicializa Statement Connection conn = null; //Inicializa Connection conn = DriverManager.getConnection(str_conn, usuario, senha); stmt = conn.createStatement(); String sql = "UPDATE "+banco+".funcionario SET Cod_Funcionario = 2 WHERE Cod_Funcionario = 1"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, banco); pstmt.executeUpdate(); pstmt.close(); stmt.close(); conn.close(); } catch (Exception ex){ JOptionPane.showMessageDialog(null, "Erro (" + ex + ") ao conectar ao banco de dados, entre em contato com o Administrador!"); }
O código acima dá um erro dizendo que há um erro de sistaxe SQL no comando, mas se eu mudar de PreparedStatement pra Statement e deixar o código assim:

try { DriverManager.registerDriver(new com.mysql.jdbc.Driver()); String banco = "testetcc"; //Nome do Banco criado String host = "localhost"; //Maquina onde está o banco String str_conn = "jdbc:mysql://" + host + ":3306/" + banco; //URL de conexão String usuario = "root"; //Usuário do banco String senha = ""; //Senha de conexão Statement stmt = null; //Inicializa Statement Connection conn = null; //Inicializa Connection conn = DriverManager.getConnection(str_conn, usuario, senha); stmt = conn.createStatement(); String sql = "UPDATE "+banco+".funcionario SET Cod_Funcionario = 2 WHERE Cod_Funcionario = 1"; stmt.executeUpdate(sql); stmt.close(); conn.close(); } catch (Exception ex){ JOptionPane.showMessageDialog(null, "Erro (" + ex + ") ao conectar ao banco de dados, entre em contato com o Administrador!"); }
Ele funciona perfeitamente, alguém pode me dizer por quê?
Obrigado

14 Respostas

J

O seu banco suporta PreparedStatement?

A proposito, eu não percebi pq vc está setando o valor do banco sendo q vc não deixou nenhuma referência pra isso no código…

S

Provavelmente ele suporta, afinal já fiz inclusões e pesquisas utilizando PreparedStatement.
No caso eu não vou usar só a variável banco, haverão variáveis para o que o usuário vai digitar, para o campo antigo e para o que o usuário quer mudar, eu só fiz esse como um teste, e pelo visto está dando erro!

WendersonLP

Se você pretar bem atenção, você na sua declaração sql está concatenando o nome do banco o o restante
da instrução, e logo abaixo você está utilizando “pstmt.setString(1, banco);”
Faça isso e veja se funciona.

String sql = "UPDATE ?.funcionario SET Cod_Funcionario = 2 WHERE Cod_Funcionario = 1";  
PreparedStatement pstmt = conn.prepareStatement(sql);  
pstmt.setString(1, banco);  
pstmt.executeUpdate();
J

Eu posso estar enganado, mas a mágica de vc criar preparedstatements é para casos em q vc tem uma consulta q pode ser pré-compilada e que você muda apenas os valores q vc atribuirá as colunas e não para esse caso q vc está tentando mudar o nome da coluna no update. Me corrijam se eu estiver errado…

S

Eu também não vou poder dizer se funciona para esse caso, pelo que vejo acho que não, mas então como eu faria o que eu quero? Concateno o banco, as colunas e tudo mais em um Statement comum mesmo?

J

Antes de tudo uma pergunta:

A sua lógica implica a atualização dos mesmos valores, em tabelas com o mesmo nome mas em bancos diferentes?

S

Não, ela implica em atualização de dados diferentes, em tabelas diferentes, mas banco igual. (Como eu disse, isso foi só para testar)

J

Vc vai criar um PreparedStatement para cada query que você quer apenas mudar valores associados as colunas.
Ex:

String sql = INSERT INTO funcionário (nome, endereço) VALUES (?, ?);

PreparedStatement pstmt = conn.prepareStatement(sql);

pstmt.setString(1, SirPlinio);

pstmt.setString(2, Av. SirPlinio, 222);
S

Mas eu não quero um insert, eu já tenho ele, eu quero fazer um UPDATE!
O problema é que está dando erro de sintaxe quando eu uso o PreparedStatement do jeito que eu falei no primeiro post, e eu quero saber porque!
Caso não dê para usar dessa forma eu mudarei, mas no momento só quero saber porque dá erro!

J

Pra mim no UPDATE vc deve usar o PreparedStatement assim:

String sql = UPDATE funcionário SET nome = ? WHERE idFuncionario = ?;

PreparedStatement pstmt = conn.prepareStatement(sql);

pstmt.setString(1, SirPlinio Atualizando);

pstmt.setInt(2, 2);
S

Mas e se nesse update pro exemplo eu quero usar outra tabela? Uma escolhida pelo usuário?

J

Antes de qualquer coisa, mudar apenas o nome da tabela não serve pq se não vc tb teria de mudar os campos da query, afinal é uma tabela diferente, certo? Não consigo entender pq vc quer deixar o nome da tabela como um “coringa”.

Olhe, eu estava tentando pesquisar sobre como essas querys são pré-compiladas e se possa extrair o devido benefício das mesmas, mas ficou tarde pra mim e eu acabei não achando o q eu queria. Na minha opinião vc deve tentar explorar o uso dessa pré-compilação para aproveitar de fato o PreparedStatement. Tente buscar a informação sobre como o banco explora isso, ou se alguém puder se manifestar e dizer se essa pré-compilação depende do objeto PreparedStatement ou se o banco guarda a query e toda vez q vc cria o PreparedStatement com o texto da query já criada o banco reconheça independentemente do objeto (acredito q seja esse o caso).
Na minha opinião, entender isso vai te ajudar a pensar como usar os PreparedStatements…

S

Obrigado, vou pesquisar, qualquer pessoa que queira dizer algo está livre para adicionar alguma informação aqui!

S

Descobri um jeito de fazer funcionar:

String novodado = "DANIEL PEREIRA CINALLI"; String campomudado = "Nome"; String dadoprocura = "1"; String campoprocura = "Cod_Funcionario"; try { DriverManager.registerDriver(new com.mysql.jdbc.Driver()); String banco = "testetcc"; //Nome do Banco criado String host = "localhost"; //Maquina onde está o banco String str_conn = "jdbc:mysql://" + host + ":3306/" + banco; //URL de conexão String usuario = "root"; //Usuário do banco String senha = ""; //Senha de conexão Statement stmt = null; //Inicializa Statement Connection conn = null; //Inicializa Connection conn = DriverManager.getConnection(str_conn, usuario, senha); stmt = conn.createStatement(); String sql = "UPDATE testetcc.funcionario SET "+campomudado+" = ? WHERE "+campoprocura+" = ?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, novodado); pstmt.setString(2, dadoprocura); pstmt.executeUpdate(); pstmt.close(); stmt.close(); conn.close(); } catch (Exception ex){ JOptionPane.showMessageDialog(null, "Erro (" + ex + ") ao conectar ao banco de dados, entre em contato com o Administrador!"); }
Por algum motivo só podem ser substituidos dados no PreparedStatement, os dados que vão para o banco, ele não funciona como uma concatenação. :frowning:

Criado 13 de maio de 2010
Ultima resposta 13 de mai. de 2010
Respostas 14
Participantes 3