[RESOLVIDO] Como atualizar vários dados em um único UPDATE
16 respostasResolvido
netbeansjava
rodriguesabner
E aí pessoal, tranquilo?
Bom, é a primeira vez que posto aqui no Fórum, primeiro gostaria de agradecer a todos, pois me ajudaram muito em várias dúvidas que tive. (Eu procurei muito sobre isso mas não tive sucesso, de verdade!).
Enfim vamos lá:
Minha dúvida é a seguinte, eu queria alterar vários IDS de uma vez só. Eu tenho meu UPDATE funcionando normalzinho:
try{PreparedStatementpst=conecta.conn.prepareStatement("UPDATE encomendas SET entregue=?, datasaida=?, horasaida=?, porteiroentregou=? WHERE id=?");pst.setString(1,botaoentregue.getText());pst.setString(2,datasaida.getText());pst.setString(3,horasaida.getText());pst.setString(4,(String)comboporteiro.getSelectedItem());pst.setInt(5,Integer.parseInt(campoid.getText()));pst.executeUpdate();JOptionPane.showMessageDialog(rootPane,"Atualizado com Sucesso");}catch(SQLExceptionex){JOptionPane.showMessageDialog(rootPane,"Erro ao atualizar dados\n ERRO: "+ex);}
Minha query está funcionando belezinha também.
Explicando melhor, eu quero digitar no meu JTextField os Id’s: 1,2,3 e atualizar todos apertando meu botão.
Passe uma lista de ID,s para a query SQL, como por exemplo!
Updatetabelasetcoluna=?whereidin(1,2,3,4,5,6);
rodriguesabner
E aí Jonathan, tudo bem?
Cara, no Postgres até rolou, mas não consegui passar esse comando pro PreparedStatement
Deu esse erro Exception in thread “AWT-EventQueue-0” java.lang.NumberFormatException: For input string: "1,2"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
Meu prepared
PreparedStatementpst=conecta.conn.prepareStatement("UPDATE encomendas SET entregue=?, datasaida=?, horasaida=?, porteiroentregou=? WHERE id in (?,?)");
No caso eu queria que a pessoa que fosse utilizar o software, colocasse no campo “1,2,3,4,5,6” e atualizasse, entende? Nem sempre nessa ordem, com uma ID eu consigo, mas com o IN não
rolou
Jonathan_Medeiros1 like
Já tentou fazer da seguinte forma, recuperando o valor dos ID’s como sendo uma String única ?
Com isso, basta passar essa string como parâmetro para o PreparedStatement.
Lembrando que ele teria que ir como uma String, pois não teria como converter este valor em Integer.
Exemplo:
PreparedStatementpst=conecta.conn.prepareStatement("UPDATE tabela SET campo=? WHERE id in (?)");pst.setString(1,valorCampo.getText());pst.setString(2,campoID.getText());//Aqui já vai existir a lista de ID's como por exemplo (3,9,4,6,8)
rodriguesabner
Não funfa também, o pior é que nem erro ele dá, só fala que foi atualizado. Eu coloco lá no jText “1,2” (que são meus únicos dois ID’s) mas quando eu vejo no Postgres, nada muda. Mas valeu cara, vou deixar assim mesmo, vou dar mais trampo pra os caras mesmo hahaha, valeu!
E aí cara, tudo bem? Eu fiz isso, mas diz que não foi possível encontrar uma matriz para o nome fornecido
pmlm
Experimenta com “varchar” em minúsculas. Esta parte é específica da BD e em alguns casos pode ser case sensitive.
rodriguesabner
Também, da o mesmo erro… Desisti já, vou deixar como estava, mas valeu cara! Abraço.
staroski1 like
Até onde sei, PreparedStatement não funciona utilizando parâmetros na cláusula IN.
Então você tem que montar dinamicamente a query, concatenando os elementos a serem utilizado na cláusula IN.
rodriguesabner
Eu teria que criar então uma classe DAO pra fazer toda essa volta?
Certa vez tive que fazer umas “gambiarras” dessas:
ps=conn.prepareStatement(CONSULTA_GERAR_ARQUIVO_HISTORICO+sql.toString()+" UNION ALL "+CONSULTA_GERAR_ARQUIVO_UNION+sqlAtual.toString()+GROUP2+ORDER2);
Onde cada palavra com maiúscula, é um trecho da consulta no BD… assim montava a consulta.
private static final String SQL_GERAL = "SELECT CodTecnologia, Operadora, StatusSIMCard , SUM(Quantidade) AS Quantidade FROM ( ";
P
Pacato1 like
a classe está grande, mas eu valido tudo, recebo uma lista, monto o IN e retorno a lista de resultado (que no seu caso não precisará, eu acho).
publicList<ConsultaGerarRelatorio>listaTecnologias(List<Integer>tecnologias,List<Integer>operadoras,List<Integer>status){Connectionconn=null;PreparedStatementps=null;List<ConsultaGerarRelatorio>listaConsultaGeraRelatorio=newArrayList<ConsultaGerarRelatorio>();if(!tecnologias.isEmpty()){sql.append(" Dispositivo.CodigoTecnologia IN (");for(Iterator<Integer>it=tecnologias.iterator();it.hasNext();){it.next();sql.append("?");if(it.hasNext()){sql.append(",");}}sql.append(")");}if(!operadoras.isEmpty()){if(!tecnologias.isEmpty()){sql.append(" AND SIMCard.CodigoOperadora IN (");for(Iterator<Integer>it=operadoras.iterator();it.hasNext();){it.next();sql.append("?");if(it.hasNext()){sql.append(",");}}sql.append(")");}else{sql.append(" SIMCard.CodigoOperadora IN (");for(Iterator<Integer>it=operadoras.iterator();it.hasNext();){it.next();sql.append("?");if(it.hasNext()){sql.append(",");}}sql.append(")");}}if(!status.isEmpty()){if(!tecnologias.isEmpty()||!operadoras.isEmpty()){sql.append(" AND SIMCard.CodigoStatusSIMCard IN (");for(Iterator<Integer>it=status.iterator();it.hasNext();){it.next();sql.append("?");if(it.hasNext()){sql.append(",");}}sql.append(")");}else{sql.append(" SIMCard.CodigoStatusSIMCard IN (");for(Iterator<Integer>it=status.iterator();it.hasNext();){it.next();sql.append("?");if(it.hasNext()){sql.append(",");}}sql.append(")");}}sql.append(" )");try{conn=ConnectionManager.obterConexao();ps=conn.prepareStatement(SQL_VIRTUAL+SQL_ATUAL+sql.toString()+GROUP_VIRTUAL+GROUP+ORDER);intindicePs=1;if(!tecnologias.isEmpty()){for(Integeri:tecnologias){ps.setInt(indicePs++,i);}}if(!operadoras.isEmpty()){for(Integeri:operadoras){ps.setInt(indicePs++,i);}}if(!status.isEmpty()){for(Integeri:status){ps.setInt(indicePs++,i);}}//System.out.println("Consulta: " + SQL_ATUAL + sql.toString() + GROUP + ORDER);//System.out.println(ps);ResultSetrs=ps.executeQuery();while(rs.next()){ConsultaGerarRelatoriolistaRelatorio=newConsultaGerarRelatorio(rs.getString("CodTecnologia"),rs.getString("Operadora"),rs.getString("StatusSIMCard"),rs.getString("Quantidade"));listaConsultaGeraRelatorio.add(listaRelatorio);/*System.out.println(rs.getString("CodTecnologia") + " " + rs.getString("Operadora") + " " + rs.getString("StatusLinha") + " " + rs.getString("Quantidade"));*/}}catch(Exceptione){e.printStackTrace();}finally{ConnectionManager.fecharConexao(conn,null,ps);}returnlistaConsultaGeraRelatorio;}
rodriguesabner
Assim que eu ligar o PC dou uma olhada
Solucao aceita
rodriguesabner
Revivendo o tópico só pra ajudar se alguém for precisar disso, é bem simples, na época eu não manjava nada e pra mim tudo era um bicho de 200 cabeças.
Declarei o Array como global: List<String> linhasX = new ArrayList<>();
Bom, pra poder selecionar os Id’s da tabela eu coloquei um MouseClicked:
conecta.conexao();Stringidentifica=""+tabela.getValueAt(tabela.getSelectedRow(),0);try{conecta.executaSQL("select * from algumaCoisa where id='"+identifica+"'");conecta.rs.first();id=conecta.rs.getInt("id");campoapto.setText(String.valueOf(conecta.rs.getString("algumaColuna")));linhasX.add(String.valueOf(id));//Aqui eu adiciono o meu ID selecionado no array.}catch(SQLExceptions){s.printStackTrace();JOptionPane.showMessageDialog(rootPane,"Erro ao selecionar este item. Tente Novamente!");}finally{conecta.desconecta();}
Aqui é pra editar:
List<String>nomes=linhasX;StringtodosNomes=String.join(", ",nomes);conecta.conexao();try{PreparedStatementpst=conecta.conn.prepareStatement("UPDATE algumaCoisa SET colunaX= ? WHERE id IN ("+todosNomes+")");pst.setString(1,"Teste");pst.execute();linhasX.clear();//Aqui eu limpo o ArrayJOptionPane.showMessageDialog(null,"Alterado com Sucesso");}catch(SQLExceptionex){JOptionPane.showMessageDialog(null,"Erro ao alterar apartamento. Tente Novamente!");}finally{conecta.desconecta();}