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
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…
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!
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();
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…
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?
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?
Não, ela implica em atualização de dados diferentes, em tabelas diferentes, mas banco igual. (Como eu disse, isso foi só para testar)
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”);
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!
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);
Mas e se nesse update pro exemplo eu quero usar outra tabela? Uma escolhida pelo usuário?
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…
Obrigado, vou pesquisar, qualquer pessoa que queira dizer algo está livre para adicionar alguma informação aqui!
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.