PreparedStatement dá erro e Statement não, por quê?
14 respostas
S
SirPlinio
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
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
SirPlinio
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.
Stringsql="UPDATE ?.funcionario SET Cod_Funcionario = 2 WHERE Cod_Funcionario = 1";PreparedStatementpstmt=conn.prepareStatement(sql);pstmt.setString(1,banco);pstmt.executeUpdate();
J
JavaNewbie
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
SirPlinio
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
JavaNewbie
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
SirPlinio
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
JavaNewbie
Vc vai criar um PreparedStatement para cada query que você quer apenas mudar valores associados as colunas.
Ex:
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
JavaNewbie
Pra mim no UPDATE vc deve usar o PreparedStatement assim:
Mas e se nesse update pro exemplo eu quero usar outra tabela? Uma escolhida pelo usuário?
J
JavaNewbie
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
SirPlinio
Obrigado, vou pesquisar, qualquer pessoa que queira dizer algo está livre para adicionar alguma informação aqui!
S
SirPlinio
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.